CollectionAssert.AreEquivalent vs Assert.Equals()

时间:2015-04-20 20:00:43

标签: c# unit-testing equality

public void NumericListCanBeSorted()
{
  var sorted = sort.SortNumbers(nums);
  Assert.AreEqual(sorted, nums);
}

public List<int> SortNumbers(List<int> nums)
    {
        List<int> sortedList = new List<int>();

        for (int i = 0; i < nums.Count(); i++)
        {
            for (int j = i + 1; j < nums.Count; j++)
            {
                if (nums[i] > nums[j])
                {
                    //Swapping values
                    nums[i] = nums[i] + nums[j];
                    nums[j] = nums[i] - nums[j];
                    nums[i] = nums[i] - nums[j];
                }
            }
            sortedList.Add(nums[i]);
        }
        return sortedList;
    }

Result Message: Assert.AreEqual failed. 
Expected:     <System.Collections.Generic.List`1[System.Int32]>. 
      Actual :<System.Collections.Generic.List`1[System.Int32]>.

预期和实际的数据类型相同。仍然测试失败。无法理解为什么?有人可以帮我知道原因。此外,它适用于以下功能。

  public List<int> SortNumbers(List<int> nums)
    {
        List<int> sortedList = new List<int>();
        for (int i = 0; i < nums.Count(); i++)
        {
            for (int j = i + 1; j < nums.Count; j++)
            {
                if (nums[i] > nums[j])
                {
                    //Swapping values
                    nums[i] = nums[i] + nums[j];
                    nums[j] = nums[i] - nums[j];
                    nums[i] = nums[i] - nums[j];
                }
            }
        }
        sortedList = nums;
        return sortedList;
    }

1 个答案:

答案 0 :(得分:25)

参考类型比较。

尝试使用CollectionAssert.AreEqual或CollectionAssert.AreEquivalent。

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.areequivalent.aspx

以下是发生的事情:

你使用Assert.AreEqual(List<int>, List<int>),其中,CLR / .NET进入并说,&#34;是列表1的引用,与列表2相同?&#34;结果是否定的,因此CLR / .NET会向您发送错误的读数。

CollectionAssert枚举数组(这是内部列表)并确定它们是否具有相同的项目。 CollectionAssert.AreEqual检查他们在同一订单中是否有相同的商品。 CollectionAssert.AreEquivalent以任何顺序检查它们是否具有相同的项目。

ANY 数组/列表/字典必须使用CollectionAssert进行此类比较。

例如:

List<int> l1 = new List<int>();
List<int> l2 = l1;
Assert.AreEqual(l1, l2);

由于l2已设置为与l1相同的引用,因此结果为true。

然而,

List<int> l1 = new List<int>();
List<int> l2 = new List<int>();
Assert.AreEqual(l1, l2);

由于l2已成为对 NEW 对象的 NEW 引用,因此会导致 false 。而使用

CollectionAssert.AreEqual(l1, l2);

在上述任何一种情况下都会导致 true 。这是因为CLR / .NET实际上是通过列表并基本上对其进行盘点。

另一个编辑,因为我想进一步澄清:你也可以使用CollectionAssert.AreEquivalent,它不能保证相同顺序的项目,但只是保证数组/列表/字典具有相同的数量相同的项目。即:

1,2,3,3,2,1
1,3,2,2,3,1

这将导致{strong> true 与CollectionAssert.AreEquivalent false CollectionAssert.AreEqual