如何在单元测试中比较列表


180

该测试如何失败?

[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
}

Answers:


370

要对集合进行断言,应使用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/zh-cn/library/ms243779.aspx
user2023861

2
请注意,这CollectionAssert.AreEqual可能比Assert.IsTrue...SequenceEqual
Mark Sowul '16

1
@MarkSowul:但是它带有更好的故障诊断,对吗?
乔恩·斯基特

2
@MarkSowul:嗯...听起来像是值得报告的错误。没有理由应该那么糟糕。
乔恩·斯基特

34

我想这会有所帮助

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

4
那也是我的后备,但我希望CollectionAssert将提供更多有用的失败消息。
乔恩·斯基特

4
可悲的是,它并不是真的:“ CollectionAssert.AreEqual失败。(索引0处的元素不匹配。)”(元素是什么?)
2016年

17

如果要检查每个值是否包含相同的值集合,则应使用:

CollectionAssert.AreEquivalent(expected, actual);

编辑:

“如果两个集合具有相同数量且相同数量的相同元素,但它们是任意的,则它们是等效的。如果元素的值相等,则元素相等,而不是引用相同的对象。” - 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它将起作用。
Ray Cheng

6

此测试比较输入的日期,检查其if年是否存在,如果是,则从输入日期输出20个leap年,否则输出NEXT 20个years年myTest.Testing引用myTest实例,该实例又调用值从称为测试的列表中,其中包含所需的计算值。我必须做的一部分练习。

[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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.