Assert.AreEqual在单元测试中失败

时间:2011-03-03 12:37:19

标签: 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("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中找不到模块窗口。

接下来的步骤是什么?

10 个答案:

答案 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)

您的实际列表似乎包含的项目多于预期的列表。因此他们并不平等。