C# CollectionAssert.Areequality vs Assert.Equals() public void NumericListCanBeSorted() { var sorted=sort.SortNumbers(nums); Assert.AreEqual(已排序,nums); } 公共列表排序编号(列表NUM) { List sortedList=新列表(); 对于(int i=0;i

C# CollectionAssert.Areequality vs Assert.Equals() public void NumericListCanBeSorted() { var sorted=sort.SortNumbers(nums); Assert.AreEqual(已排序,nums); } 公共列表排序编号(列表NUM) { List sortedList=新列表(); 对于(int i=0;i,c#,unit-testing,equality,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>

预期和实际的数据类型相同。测试仍然失败。不明白为什么?有人能帮我知道原因吗?此外,它还有以下功能

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 SortNumbers(List nums)
{
List sortedList=新列表();
对于(int i=0;inums[j])
{
//交换值
nums[i]=nums[i]+nums[j];
nums[j]=nums[i]-nums[j];
nums[i]=nums[i]-nums[j];
}
}
}
分类列表=nums;
返回分类列表;
}

参考类型比较

尝试使用CollectionAssert.AreEqual或CollectionAssert.Areequality

下面是发生的情况:

您使用了
Assert.AreEqual(List,List)
,其中,CLR/.NET进入并说,“List 1的引用与List 2相同吗?”结果为否,因此CLR/.NET向您发送错误的读数

CollectionAssert
枚举数组(列表在内部是什么),并确定它们是否具有相同的项<代码>集合Assert.AreEqual检查它们是否具有相同顺序的相同项目
CollectionAssert.AreEquivalent
检查它们是否以任何顺序拥有相同的项目

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

例如:

  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;
    }
由于
l2
对新对象进行了新引用,这将导致错误。鉴于使用

List<int> l1 = new List<int>();
List<int> l2 = new List<int>();
Assert.AreEqual(l1, l2);
在上述任何一种情况下,都将导致为true。这是因为CLR/.NET实际上遍历了该列表并对其进行了编目

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

CollectionAssert.AreEqual(l1, l2);

这将导致true
CollectionAssert.Areequired
,但是false
CollectionAssert.Areequired

您能详细解释一下吗。我在找一个相等的。@SravanKumar sortedList!=nums因此失败-您需要逐项比较,而不是两个数组对象。调试并尝试在即时窗口或监视窗口中检查sortedList==nums。@Danny varod sortedList确实等于nums(两者都包含已排序的数字)。@EBrown的解释是我遗漏的。谢谢你,埃布罗恩
CollectionAssert.AreEqual(l1, l2);
1,2,3,3,2,1
1,3,2,2,3,1