ASP.Net XUnit 检查对象列表是否包含特定对象

dir*_*k.z 5 c# asp.net-mvc unit-testing list

我正在尝试将单元测试添加到我的项目中。其中一些测试正在检查对象列表是否不包含对象。为了检查列表是否包含我尝试过的对象Assert.Contains(MyList, ExpectedObject),但它仍然给出一个错误,指出该列表不包含该对象。即使当我调试测试时,我也可以看到该对象已正确添加到列表中。

同样的情况也发生在Assert.DoesNotContain(MyList, ExpectedObject). 当我从列表中删除一个项目并执行此检查时,它确实说它不在列表中。但是当我不再删除该项目时,它仍然说它不再在列表中。尽管它仍然在列表中。

当我尝试使用测试列表时:List<string>. 并执行添加和删除项目的相同操作,然后检查这些项目是否在列表中。它确实有效。也许Assert.Contains不适用于对象列表。但编译器不会给出任何错误。我还已经检查过它是否ExpectedObject与列表中的对象类型相同。

是否有另一种方法来检查对象是否在列表中。任何帮助表示赞赏。

Mar*_*len 10

在您的测试中,ExpectedObject 是列表中的实际对象还是具有相同值的对象?在 C# 中,具有相同属性值的两个对象实际上并不相等。我怀疑这就是你的测试失败的原因。具有相同值的两个字符串被认为是相等的,因为字符串对象实现了 Equals 方法(以及更多方法),就像 @dorukerenaktas 指出的那样。

有多种方法可以解决这个问题。最简单的方法是检查集合中是否存在具有预期属性值的对象。

有一个重载Assert.Contains允许您指定谓词,例如:

Assert.Contains(MyList, item => item.Id == expectedId)
Run Code Online (Sandbox Code Playgroud)

另一种选择是重写Equals对象上的方法,就像@dorukerenaktas 解释的那样,但我只会建议如果它确实对您的类有意义的话。我绝对会这样做只是为了让你可以在测试中使用它。