C# Assert.AreEqual在单元测试中失败

C# Assert.AreEqual在单元测试中失败,c#,.net,asp.net,unit-testing,debugging,C#,.net,Asp.net,Unit Testing,Debugging,我有以下单元测试: string MtrlCode = "0"; Assessment target = new Assessment(MtrlCode); List<string> EdgeCaseSymbolCodes = new List<string>(); //More than 3 EdgeCaseSymbolCodes.Add("FLA"); EdgeCaseSymbolCodes.Add("HAR"); EdgeCaseSymbolCodes.Add("

我有以下单元测试:

string MtrlCode = "0";
Assessment target = new Assessment(MtrlCode);

List<string> EdgeCaseSymbolCodes = new List<string>(); //More than 3
EdgeCaseSymbolCodes.Add("FLA");
EdgeCaseSymbolCodes.Add("HAR");
EdgeCaseSymbolCodes.Add("COR");
EdgeCaseSymbolCodes.Add("ENVON");
EdgeCaseSymbolCodes.Add("ENVR");
EdgeCaseSymbolCodes.Add("EXP");

target.HazardSymbols = EdgeCaseSymbolCodes;

List<string> EdgeCaseSymbolCodesExpected = new List<string>(); //Should be 3
EdgeCaseSymbolCodesExpected.Add("FLA");
EdgeCaseSymbolCodesExpected.Add("HAR");
EdgeCaseSymbolCodesExpected.Add("COR");

System.Windows.Forms.MessageBox.Show(EdgeCaseSymbolCodesExpected[0] + EdgeCaseSymbolCodesExpected[1] + EdgeCaseSymbolCodesExpected[2] + " = \n" + target.HazardSymbols[0] + target.HazardSymbols[1] + target.HazardSymbols[2]);

Assert.AreEqual<List<string>>(EdgeCaseSymbolCodesExpected, target.HazardSymbols, "COSHH_2008.Custom_Classes.Assessment.setHazardSymbols Edge Case did not return the expected value.");
string MtrlCode=“0”;
评估目标=新评估(MTRL代码);
List EdgeCaseSymbolCodes=新列表()//超过3个
EdgeCaseSymbolCodes.添加(“FLA”);
EdgeCaseSymbolCodes.添加(“HAR”);
EdgeCaseSymbolCodes.添加(“COR”);
EdgeCaseSymbolCodes.添加(“ENVON”);
EdgeCaseSymbolCodes.添加(“ENVR”);
EdgeCaseSymbolCodes.添加(“EXP”);
target.HazardSymbols=边缘密码;
List EDGECASESYMBOLCODESPECTED=新列表()//应该是3
EDGECASESYMBOLCODESEPECTED.添加(“FLA”);
EDGECASESYMBOLCODESEPECTED.添加(“HAR”);
EDGECASESYMBOLCODESEPECTED.添加(“COR”);
System.Windows.Forms.MessageBox.Show(EdgeCaseSymbolCodesExpected[0]+EdgeCaseSymbolCodesExpected[1]+EdgeCaseSymbolCodesExpected[2]+“=\n”+target.HazardSymbols[0]+target.HazardSymbols[1]+target.HazardSymbols[2]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected,target.HazardSymbols,“COSHH_2008.Custom_Classes.Assessment.setHazardSymbols边缘大小写未返回预期值”);
它正在测试一个边缘情况(当
列表
包含3个以上元素时),所需输出仅为前3个元素的返回

目前测试失败,我不得不求助于使用
MessageBox
查看测试内部(因为没有命中断点!)

从我所看到的元素是相同的,但是我意识到
列表
对象可能还有其他不同之处,但我看不到这一点,因为断点从未被击中

我在Visual Studio 2005中找不到“模块”窗口


下一步是什么?

对列表的引用不同,请尝试

Assert.AreEqual(EdgeCaseSymbolCodesExpected[0], target.HazardSymbols[0]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[1], target.HazardSymbols[1]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[2], target.HazardSymbols[2]);

如果
Assert.Equals
使用默认比较器(不知道是否使用),则此测试将失败,因为
List
默认使用引用相等

如果两个列表具有相同的顺序,则可以使用linq extensionmethod测试元素相等性

如果您想考虑具有相同元素的列表,即使使用不同的排序,也可以使用<代码> A.交叉(B).CONTUTE(=).AULL(B).CONTUTE()/CODE >,因为LINQ.

中没有<代码> StimeBase<代码>扩展方法>
即使按值进行比较,为什么您希望包含3个元素的列表等于包含6个元素的列表


作为旁注:您的命名约定不同于.net约定。通常局部变量名以小写字母开头


我发现行
target.HazardSymbols=EdgeCaseSymbolCodes非常奇怪。这是否意味着您有一个带有公共setter的
List
类型的属性?我宁愿避免这些,因为这会导致不同的对象使用相同的列表实例,如果它们修改自己的列表,可能会产生奇怪的效果。

断言失败,因为它会验证两个列表是否实际上是相同的实例。他们不是;这是两个不同的列表实例。您需要编写代码来验证这两个列表是否包含相同的项目集。

我认为
Assert.AreEqual
不支持集合

您必须编写自己的方法来检查集合中的元素数量,并分别比较它们


对于如何定义集合的相等,您必须提供自己的逻辑,即如果两个集合包含相同的元素,但顺序不同,它们是否仍然相等?

这看起来像是参考值与值的比较。如果有两个具有相同特性值的对象的不同实例,默认情况下,使用默认比较,它们永远不会“相等”。您必须比较对象的值。尝试编写代码来比较每个实例的值。

我也面临同样的问题。作为一种解决方法,您可以检查列表的计数,并对每个列表执行一次检查,并检查包含的内容。

首先,您的列表是不同的。一个有3个元素,另一个有6个元素,所以我一开始不希望它们相等


其次,
List
类仅当它们是完全相同的列表,而不仅仅是具有相同元素的列表时,才会进行相等的比较。在您的情况下,您希望使用类似于断言(EdgeCaseSymbolCodeSpecpected.SequenceEqual(target.HazardSymbols)
的东西,它将遍历列表中的每个元素,比较每个元素是否相等。

您的实际列表似乎包含比预期列表更多的项。因此它们不相等。

使用
CollectionAssert.AreEqual()

如果要与列表进行比较,可以使用该代码段创建一个void函数

Assert.AreEqual(response.Count, acceptedResponse.Count,"Diferent list length");
            for (int i = 0; i < acceptedResponse.Count; i++)
            {
                Assert.AreEqual(response[i],acceptedResponse[i]);
            }
Assert.AreEqual(response.Count、acceptedResponse.Count,“不同的列表长度”);
for(int i=0;i
测试以何种方式失败?断言是否失败(它可能应该失败;
Assert.AreEqual
可能不会比较列表的内容)?异常?断言失败-我正在尝试调试确切原因。根据文档“如果对象不相等,断言将失败”的说明,断言失败你看,这正是我一开始的想法,但我有其他单元测试比较两个完全不同的列表,但断言成功。@m.edmondson:你应该仔细看看其他单元测试,并验证它们是否测试你认为它们做的事情。Assert.AreEqual()比较值,而不是Assert.aream()它比较了引用。在nUnit中,也就是说。这只是很快被拼凑在一起,但我接受你的反馈。是的HazardSymbols有一个类型为List的公共setter。除非
AreEqual()
特别支持内置的集合。它可能会对该类型使用默认的相等比较。列表中的哪个是引用。我可以理解关于修改列表的两个对象的说法,但由于