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中找不到模块窗口.
你接下来的步骤是什么?
如果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实例导致不同的对象,如果他们修改了他们拥有的列表,则会产生奇怪的效果.
对列表的引用不同,请尝试改为
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)