次の方法で共有


MSTEST0026: アサーションでの条件付きアクセスを回避する

プロパティ
ルール ID MSTEST0026
Title アサーションでの条件付きアクセスを回避する
カテゴリ 使用法
修正が中断ありか中断なしか なし
既定で有効 はい (3.5 から 3.7 まで)。 X (3.8 以降)
既定の重要度 情報
導入されたバージョン 3.5.0
コード修正の有無 いいえ

原因

この規則では、null 条件演算子を含む引数(?.) または ?[] が以下のアサーション メソッドに渡されると、診断が発生します:

  • Assert.IsTrue
  • Assert.IsFalse
  • Assert.AreEqual
  • Assert.AreNotEqual
  • Assert.AreSame
  • Assert.AreNotSame
  • CollectionAssert.AreEqual
  • CollectionAssert.AreNotEqual
  • CollectionAssert.AreEquivalent
  • CollectionAssert.AreNotEquivalent
  • CollectionAssert.Contains
  • CollectionAssert.DoesNotContain
  • CollectionAssert.AllItemsAreNotNull
  • CollectionAssert.AllItemsAreUnique
  • CollectionAssert.AllItemsAreInstancesOfType
  • CollectionAssert.IsSubsetOf
  • CollectionAssert.IsNotSubsetOf
  • StringAssert.Contains
  • StringAssert.StartsWith
  • StringAssert.EndsWith
  • StringAssert.Matches
  • StringAssert.DoesNotMatch

規則の説明

単体テストのアサーションの目的は、特定の条件が満たされていることを確認することです。 アサーションで条件付きアクセス演算子を使用すると、アクセスされるオブジェクトの状態に応じて、満たされる場合と満たされない可能性がある追加の条件が導入されます。 これにより、一貫性のないテスト結果が得られ、テストの明確性が低下する可能性があります。

違反の修正方法

アサーション メソッドに渡されるときに、引数に (?.) または ?[] が含まれていないことを確認します。 代わりに、アサーションを作成する前に null チェックを実行してください。

Company? company = GetCompany();
Assert.AreEqual("Contoso", company?.Name); // MSTEST0026
StringAssert.Contains(company?.Address, "Brazil"); // MSTEST0026

// Fixed code
Assert.IsNotNull(company);
Assert.AreEqual("Contoso", company.Name);
StringAssert.Contains(company.Address, "Brazil");

どのようなときに警告を抑制するか

この規則の警告を抑制することはお勧めしません。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable MSTEST0026
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0026

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0026.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。