我有以下单元测试:
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.");
正在测试边缘情况(List<string>
超过3个元素的时间),所需输出仅返回前3个。
目前测试失败,我不得不求助于使用MessageBox
查看测试内部(由于断点没有被击中!)。
从我所看到的元素是相同的,但是我意识到List<string>
对象可能还有其他不同之处,但我看不到这一点,因为断点从未被击中。
我在Visual Studio 2005中找不到模块窗口。
接下来的步骤是什么?
答案 0 :(得分:14)
使用CollectionAssert.AreEqual()
。
答案 1 :(得分:8)
如果Assert.Equals
使用默认比较器(不知道是否存在),那么此测试将失败,因为List<T>
默认使用引用相等性。
如果两个列表具有相同的顺序,则可以使用linq extensionmethod Enumerable.SequenceEqual
来测试元素明确的相等性。
如果您想考虑具有相同元素的列表,即使排序不同,也可以使用a.Intersect(b).Count()==a.Unit(b).Count()
,因为Linq中没有SetEqual
扩展方法。
即使按值进行比较,为什么你期望包含3个元素的列表等于包含6个元素的列表呢?
作为旁注:您的命名约定与.net约定不同。通常,局部变量名称以小写字母开头。
我发现行target.HazardSymbols = EdgeCaseSymbolCodes;
非常奇怪。这是否意味着您拥有类型为List<T>
且具有公共设置者的属性?我宁愿避免那些,因为这会导致使用相同List实例的不同对象,如果他们修改了他们拥有的列表,就会产生奇怪的效果。
答案 2 :(得分:3)
对列表的引用不同,请尝试改为
Assert.AreEqual(EdgeCaseSymbolCodesExpected[0], target.HazardSymbols[0]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[1], target.HazardSymbols[1]);
Assert.AreEqual(EdgeCaseSymbolCodesExpected[2], target.HazardSymbols[2]);
答案 3 :(得分:3)
我认为Assert.AreEqual
不支持收藏。
您必须编写自己的方法来检查集合中的元素数量并单独进行比较。
您必须提供自己的逻辑,以确定如何定义集合的等同性,即。如果两个集合包含相同的元素但顺序不同,它们是否仍然相等?
答案 4 :(得分:3)
首先,您的列表不一样。一个有3个元素,另一个有6个,所以我不希望它们首先是平等的。
其次,如果List
类是完全相同的列表,而不仅仅是具有相同元素的列表,则Assert(EdgeCaseSymbolCodesExpected.SequenceEqual(target.HazardSymbols)
类仅比较为等于。在您的情况下,您希望使用{{1}}之类的内容,它将遍历列表中的每个元素,并将每个元素进行相等性比较。
答案 5 :(得分:1)
Assert
失败,因为它验证两个列表实际上是否是同一个实例。他们不是;这是两个不同的列表实例。您需要编写代码来验证这两个列表是否包含相同的项目集。
答案 6 :(得分:1)
如果要与List进行比较,可以使用该代码片段创建一个void函数。
Assert.AreEqual(response.Count, acceptedResponse.Count,"Diferent list length");
for (int i = 0; i < acceptedResponse.Count; i++)
{
Assert.AreEqual(response[i],acceptedResponse[i]);
}
答案 7 :(得分:0)
这看起来像参考与价值比较的情况。如果您有两个具有相同属性值的不同对象实例,默认情况下它们将永远不会使用默认比较“相等”。您必须比较对象的值。尝试编写代码来比较每个实例的值。
答案 8 :(得分:0)
我也遇到了同样的问题。作为一种解决方法,您可以检查列表的计数,并为每个列表执行一次并检查包含。
答案 9 :(得分:0)
您的实际列表似乎包含的项目多于预期的列表。因此他们并不平等。