MSTEST0065: コレクション型に対する Assert.AreEqual の使用を避ける

財産 価値
ルール識別子 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の呼び出しが行われます。

ルールの説明

AreEqualAreNotEqualEqualityComparer<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

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