【问题标题】:How to compare Lists in Unit Testing如何在单元测试中比较列表
【发布时间】:2012-06-18 19:35:31
【问题描述】:

这个测试怎么会失败?

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

【问题讨论】:

    标签: c# visual-studio-2010 unit-testing mstest


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        如果你想检查每个都包含相同的值集合,那么你应该使用:

        CollectionAssert.AreEquivalent(expected, actual);
        

        编辑:

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

        【讨论】:

          【解决方案4】:

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

          CollectionAssert.AreEqual(expected, actual);
          

          List&lt;T&gt; 不会覆盖Equals,所以如果Assert.AreEqual 只是调用Equals,它将最终使用引用相等。

          【讨论】:

          • 我希望这在失败时能提供更详细的消息。 “不同数量的元素”和“索引 0 处的元素不匹配”有点没用。 那它们是什么?!
          • 如果您不关心商品顺序:{A,B,C} == {C,B,A},请使用CollectionAssert.AreEquivalent 而不是msdn.microsoft.com/en-us/library/ms243779.aspx
          • 请注意CollectionAssert.AreEqual 可能比Assert.IsTrue...SequenceEqual 慢很多
          • @MarkSowul:但它具有更好的故障诊断功能,对吧?
          • @MarkSowul:嗯...听起来那是值得报告的错误。没有理由它应该那么糟糕。
          【解决方案5】:

          我尝试了此线程中的其他答案,但它们对我不起作用,我正在比较在其属性中存储了相同值但对象不同的对象集合。

          方法调用:

          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);
                  }
              }
          

          【讨论】:

          • 很好的补充,或者您也可以覆盖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);
                  }
          

          【讨论】:

            【解决方案7】:

            我想这会有所帮助

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

            【讨论】:

            • 这也是我的后备方案,但我希望 CollectionAssert 能提供更多有用的失败消息。
            • 遗憾的是,它并不是真的:“CollectionAssert.AreEqual 失败。(索引 0 处的元素不匹配。)”(元素是什么?)
            • 其次,对于具有 300k 个元素的字节数组来说,它的速度是 CollectionAsser.AreEqual 的两倍
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多