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

Ray*_*eng 166 c# unit-testing mstest visual-studio-2010

这个测试怎么会失败?

[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
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 341

要对集合进行断言,您应该使用CollectionAssert:

CollectionAssert.AreEqual(expected, actual);
Run Code Online (Sandbox Code Playgroud)

List<T>不会覆盖Equals,所以如果Assert.AreEqual只是调用Equals,它将最终使用引用相等.

  • 如果你不关心项目顺序:{A,B,C} == {C,B,A},那么使用`CollectionAssert.AreEquivalent`代替https://msdn.microsoft.com/en-us/library /ms243779.aspx (28认同)
  • 我希望在失败时给出更详细的信息."不同数量的元素"和"索引0处的元素不匹配"稍微无用.*那么他们是什么?!* (5认同)
  • 请注意,`CollectionAssert.AreEqual`可能明显慢于`Assert.IsTrue ... SequenceEqual` (2认同)
  • @MarkSowul:但它具有更好的故障诊断功能,对吧? (2认同)
  • @MarkSowul:嗯......听起来像是一个错误报告.没理由它应该那么糟糕. (2认同)

Shy*_*yju 31

我想这会有所帮助

Assert.IsTrue(expected.SequenceEqual(actual));
Run Code Online (Sandbox Code Playgroud)

  • 可悲的是,它并不是真的:"CollectionAssert.AreEqual失败.(索引0处的元素不匹配.)"(有哪些元素?) (4认同)
  • 这也是我的后退,但我希望CollectionAssert会提供更多有用的失败消息. (3认同)

top*_*101 15

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

CollectionAssert.AreEquivalent(expected, actual);
Run Code Online (Sandbox Code Playgroud)

编辑:

"如果两个集合具有相同数量的相同元素,则可以是等价的,但是如果它们的值相等,则元素相等,而不是它们引用同一个对象." - https://msdn.microsoft.com/en-us/library/ms243779.aspx


Dec*_*lan 14

我在这个帖子中尝试了其他答案,但它们对我不起作用,而且我正在比较在属性中存储了相同值的对象集合,但对象不同.

方法调用:

CompareIEnumerable(to, emailDeserialized.ToIndividual,
            (x, y) => x.ToName == y.ToName && x.ToEmailAddress == y.ToEmailAddress);
Run Code Online (Sandbox Code Playgroud)

比较方法:

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 很好的补充,或者您也可以覆盖`Equals`方法,`CollectionAssert`将起作用. (3认同)

小智 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);
        }
Run Code Online (Sandbox Code Playgroud)


Ram*_*tap 5

Fluent 断言对数组进行深度比较actualArray.Should().BeEquivalentTo(expectedArray)