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

时间:2020-05-29 12:26:50

标签: c# asp.net-mvc list unit-testing

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

Assert.Contains(MyList, item => item.Id == expectedId)

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

答案 1 :(得分:0)

通常在Java和C#中包含对象列表的方法的实现通过equals方法对其进行比较。如果默认情况下未为对象指定equals方法,则它将查找对象的唯一ID或内存地址,这意味着即使有两个对象的所有相同字段都可以不同。因为他们分别创建并分配了不同的ram地址。如果要比较对象,请重写equals方法。这将允许contains方法使用您的自定义比较方法相互比较对象。

示例:

假设您有一个对象,其中包含ID,名称,邮件等字段。如果希望ID相同的对象相等,则可以使用:

pivot_wider

答案 2 :(得分:0)

我之前也遇到过类似的问题,并且我使用fluentAssertions解决了这个问题。

例如,如果您有一个名为myList的对象列表,则该片段应该可以解决问题。

myList.Should().Contain(expectedItem);

这里有关于收藏的更多信息:https://fluentassertions.com/collections/

另一个选择是遍历列表并检查是否有任何对象与您的对象相等。这样做时,如果使用ShouldBeEquivalentTo()方法,则无需检查每个属性的相等性。如果您的对象较大或嵌套,这将非常有用,因为此方法会递归检查每个属性。

actual.Should().BeEquivalentTo(expected);

这里有更多信息:https://fluentassertions.com/objectgraphs/

我喜欢使用fluentAssetions,因为它使我的测试和断言更具可读性,并且在发生错误或断言失败时也提供非常清晰的消息,因此您可以更快地发现问题。

相关问题