CollectionAssert.AreEquivalent vs Assert.Equals()

Sra*_*mar 8 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]>.
Run Code Online (Sandbox Code Playgroud)

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

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

410*_*one 28

参考类型比较.

尝试使用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进入并说"列表1的引用与列表2相同?" 结果是否定的,因此CLR/.NET会向您发送错误的读数.

CollectionAssert枚举数组(这是内部列表)并确定它们是否具有相同的项目.CollectionAssert.AreEqual检查它们是否具有相同顺序的相同项目.CollectionAssert.AreEquivalent按任何顺序检查它们是否具有相同的项目.

ANY阵列/列表/字典必须使用CollectionAssert这样的比较.

例如:

List<int> l1 = new List<int>();
List<int> l2 = l1;
Assert.AreEqual(l1, l2);
Run Code Online (Sandbox Code Playgroud)

这将导致为真,因为l2已设置为相同的引用l1.

然而,

List<int> l1 = new List<int>();
List<int> l2 = new List<int>();
Assert.AreEqual(l1, l2);
Run Code Online (Sandbox Code Playgroud)

由于对NEW对象进行了新的引用,这将导致错误.而使用l2

CollectionAssert.AreEqual(l1, l2);
Run Code Online (Sandbox Code Playgroud)

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

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

1,2,3,3,2,1
1,3,2,2,3,1
Run Code Online (Sandbox Code Playgroud)

这将导致真正CollectionAssert.AreEquivalent,但CollectionAssert.AreEqual.