MSTEST0065: コレクション型に対する
| 財産 | 価値 |
|---|---|
| ルール識別子 | MSTEST0065 |
| タイトル | コレクション型では Assert.AreEqual を避けます |
| Category | Usage |
| 修正が破壊的か非破壊的か | Non-breaking |
| 既定で有効 | はい |
| 既定の重大度 | Warning |
| バージョン で導入された | 4.3.0 |
| コード修正はありますか | No |
注
この規則は、MSTest 4.3 以降で使用できます。
MSTest 4.3.3 以降、規則では、独自の等価動作を宣言するコレクション型は報告されません。
原因
静的な型が (Assert.AreEqual 以外の) Assert.AreNotEqualを実装する値に対して、IEnumerable<T>またはStringの呼び出しが行われます。
ルールの説明
AreEqualとAreNotEqualはEqualityComparer<T>.Defaultを使用します。 ほとんどのコレクション型 (配列、 List<T>、 IEnumerable<T> を実装するユーザー定義型など) では、要素ごとの比較ではなく、参照の等価性 (または型が自身に対して定義する等価性) にフォールバックします。 その結果、そのアサーションは、テスト作成者が意図した内容をほぼ決してアサートしません。
[TestClass]
public class TestClass
{
[TestMethod]
public void Test()
{
var expected = new[] { 1, 2, 3 };
var actual = new[] { 1, 2, 3 };
// Violation: this compares references, not contents, and fails.
Assert.AreEqual(expected, actual);
}
}
違反を修正する方法
意図に一致するアサーションを選択します。
- 順序付けされた要素ごとの比較には、
Assert.AreSequenceEqualを使用します。 - 順序付けされていない要素ごとの比較には、
Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder)を使用します。 -
Assert.AreEquivalentを使用して、詳細な構造比較を行います。
[TestClass]
public class TestClass
{
[TestMethod]
public void Test()
{
var expected = new[] { 1, 2, 3 };
var actual = new[] { 1, 2, 3 };
Assert.AreSequenceEqual(expected, actual);
}
}
どのようなときに警告を抑制するか
この警告は、型がコンテンツを比較するために独自の Equals/GetHashCode を定義し、意図的にこれに依存している場合にのみ抑制します。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable MSTEST0065
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0065
ファイル、フォルダー、またはプロジェクトのルールを無効にするには、noneでその重要度をに設定します。
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0065.severity = none
詳細については、「 コード分析の警告を抑制する方法」を参照してください。
.NET