単体テストでリストを比較する方法


181

このテストはどのように失敗しますか?

[TestMethod]
public void Get_Code()
{
    var expected = new List<int>();
    expected.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    var actual = new List<int>();
    actual.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    Assert.AreEqual(expected, actual);
    // Assert.AreSame(expected, actual)       fails
    // Assert.IsTrue(expected.Equals(actual)) fails
}

回答:


371

コレクションについて表明するには、以下を使用する必要がありますCollectionAssert

CollectionAssert.AreEqual(expected, actual);

List<T>はオーバーライドしないEqualsため、Assert.AreEqualを呼び出すだけの場合Equals、参照の等価性が使用されます。


6
これが失敗したときに、より詳細なメッセージが表示されることを願っています。「要素の数が異なる」と「インデックス0の要素が一致しない」は少し役に立たない。彼らは何ですか?
大佐パニック

32
アイテムの順序を気にしない場合:{A、B、C} == {C、B、A}、CollectionAssert.AreEquivalent代わりにmsdn.microsoft.com/en-us/library/ms243779.aspx
user2023861

2
それCollectionAssert.AreEqualよりも著しく遅くなる可能性があることに注意してくださいAssert.IsTrue...SequenceEqual
Mark Sowul

1
@MarkSowul:でも、はるかに優れた故障診断が付属していますよね?
Jon Skeet

2
@MarkSowul:うーん...バグとして報告する価値があるようです。そんなに悪くない理由はない。
Jon Skeet、2016年

34

これが役立つと思います

Assert.IsTrue(expected.SequenceEqual(actual));

4
それも私のフォールバックでしたが、CollectionAssertがより役立つ失敗メッセージを提供することを願っています。
Jon Skeet

4
悲しいことに、実際にはそうではありません。「CollectionAssert.AreEqualが失敗しました。(インデックス0の要素が一致しません。)」(要素とは何ですか?)
名前付き

17

それぞれに同じ値のコレクションが含まれていることを確認する場合は、次を使用する必要があります。

CollectionAssert.AreEquivalent(expected, actual);

編集:

「2つのコレクションは、同じ要素が同じ数量で、順序が異なっていれば同等です。同じオブジェクトを参照しているのではなく、値が等しい場合、要素は等しいです。」- https://msdn.microsoft.com/en-us/library/ms243779.aspx


14

このスレッドで他の回答を試したところ、うまくいきませんでした。プロパティに同じ値が格納されているオブジェクトのコレクションを比較していましたが、オブジェクトが異なっていました。

メソッド呼び出し:

CompareIEnumerable(to, emailDeserialized.ToIndividual,
            (x, y) => x.ToName == y.ToName && x.ToEmailAddress == y.ToEmailAddress);

比較の方法:

private static void CompareIEnumerable<T>(IEnumerable<T> one, IEnumerable<T> two, Func<T, T, bool> comparisonFunction)
    {
        var oneArray = one as T[] ?? one.ToArray();
        var twoArray = two as T[] ?? two.ToArray();

        if (oneArray.Length != twoArray.Length)
        {
            Assert.Fail("Collections are not same length");
        }

        for (int i = 0; i < oneArray.Length; i++)
        {
            var isEqual = comparisonFunction(oneArray[i], twoArray[i]);
            Assert.IsTrue(isEqual);
        }
    }

3
素敵な追加、またはEqualsメソッドをオーバーライドすることもでき、CollectionAssert動作します。
レイ・チェン

6

このテストは、日付入力を比較し、うるう年かどうかをチェックします。うるう年の場合、入力された日付から20うるう年を出力し、そうでない場合、NEXT 20うるう年を出力します。myTest.Testingは、値を呼び出すmyTestインスタンスを参照します。必要な計算値を含むTestingというリストから 私がしなければならなかった運動の一部。

[TestMethod]
        public void TestMethod1()
        {
            int testVal = 2012;
            TestClass myTest = new TestClass();
            var expected = new List<int>();
            expected.Add(2012);
            expected.Add(2016);
            expected.Add(2020);
            expected.Add(2024);
            expected.Add(2028);
            expected.Add(2032);
            expected.Add(2036);
            expected.Add(2040);
            expected.Add(2044);
            expected.Add(2048);
            expected.Add(2052);
            expected.Add(2056);
            expected.Add(2060);
            expected.Add(2064);
            expected.Add(2068);
            expected.Add(2072);
            expected.Add(2076);
            expected.Add(2080);
            expected.Add(2084);
            expected.Add(2088);
            var actual = myTest.Testing(2012);
            CollectionAssert.AreEqual(expected, actual);
        }

0
List<AdminUser> adminDetailsExpected = new List<AdminUser>()
{
new AdminUser  {firstName = "test1" , lastName = "test1" , userId = 
"001test1"  },
new AdminUser {firstName = "test2" , lastName = "test2" , userId = 
"002test2"   }
};

//行為

List<AdminUser> adminDetailsActual = RetrieveAdmin(); // your retrieve logic goes here

//主張する

Assert.AreEqual(adminDetailsExpected.Count, adminDetailsActual.Count);  //Test succeeds if the count matches else fails. This count can be used as a work around to test

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.