CollectionAssert.AreEquivalent 对比 Assert.Equals()

CollectionAssert.AreEquivalent vs Assert.Equals()

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]>.

预期和实际的数据类型相同。仍然测试失败。不明白为什么?有人可以帮我知道 reason.Moreover,它适用于以下功能。

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

引用类型比较。

尝试使用 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进去说,"is the reference of List 1 the same as List 2?"结果是no,所以CLR/.NET给你发了一个错误的读数。

CollectionAssert 枚举数组(这是内部列表)并确定它们是否具有相同的项目。 CollectionAssert.AreEqual 检查他们是否有相同订单的相同商品。 CollectionAssert.AreEquivalent 检查他们是否有相同的物品,顺序不限。

任何 array/List/Dictionary 必须使用CollectionAssert比较。

例如:

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

这将导致 true,因为 l2 已设置为与 l1 相同的引用。

然而,

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

这将导致 false,因为 l2 已成为 NEW 对 [=54= 的引用]NEW 对象。而使用

CollectionAssert.AreEqual(l1, l2);

在上述任何一种情况下都会导致 true。这是因为 CLR/.NET 实际上会遍历列表并清点它,本质上。

另一个编辑,因为我想进一步澄清:你也可以使用 CollectionAssert.AreEquivalent,这不能保证项目顺序相同,但只会保证 arrays/Lists/Dictionaries 具有相同的顺序相同物品的数量。即:

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

这将导致 trueCollectionAssert.AreEquivalent,但 falseCollectionAssert.AreEqual.