Assert.AreEqual在单元测试中失败

m.e*_*son 6 .net c# asp.net debugging unit-testing

我有以下单元测试:

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

这是测试边缘情况(List<string>具有超过3个元素的时间),所需输出是仅返回前3个.

目前测试失败了,我不得不求助于使用它MessageBox来查看测试内部(由于断点没有被击中!).

从我可以看到的元素是相同的,但我意识到List<string>对象可能有其他不同,但我不能看到这一点,因为断点从未被击中.

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

你接下来的步骤是什么?

Joh*_*vin 14

使用CollectionAssert.AreEqual().


Cod*_*aos 8

如果Assert.Equals使用默认比较器(不知道是否存在),则此测试将失败,因为List<T>默认情况下使用引用相等性.

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

如果你想考虑具有相同元素的列表,即使使用不同的顺序,你也可以使用,a.Intersect(b).Count()==a.Unit(b).Count()因为SetEqualLinq中没有扩展方法.


即使按值进行比较,为什么您希望包含3个元素的列表等于包含6个元素的列表?


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

我发现这条线target.HazardSymbols = EdgeCaseSymbolCodes;非常奇怪.这是否意味着你拥有一个List<T>带有公共二传手的类型的属性?我宁愿避免那些,因为这会导致使用相同的List实例导致不同的对象,如果他们修改了他们拥有的列表,则会产生奇怪的效果.


Ste*_*cya 3

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

Assert.AreEqual(EdgeCaseSymbolCodesExpected[0], target.HazardSymbols[0]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[1], target.HazardSymbols[1]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[2], target.HazardSymbols[2]);
Run Code Online (Sandbox Code Playgroud)