xUnit 断言多个属性

xUnit assert multiple properties

在 xUnit 中有没有办法只断言特定的属性?

对于给定的实用程序 class 方法

public static CopyStuff(Oder o1, Order o2)
{
   o1.Name = o2.Name;
   o1.Age = o2.Age;
   ...
}

有没有办法只对这两个或更多属性断言?而不是编写多个断言?

我愿意

// Something like this
Assert(result, o2, [Name, Age, Blah..]) 

不,不是没有使用反射。即使有反思,我也不推荐这种方法。单元测试应该有利于可读性而不是简洁。只需使用多个断言。

另外,看看 xUnit tests 看看他们是如何实现的。

如果有问题的 class 实现了一个适当行为的自定义 Equals(),或者如果它是一个结构(Equals() 默认情况下进行逐字段比较)或匿名类型(Equals() 进行 属性-by-属性 比较),那么您可以断言它们在单个断言中相等。

虽然这不是个好主意;复制和相等操作中可能存在一个相关的错误,这意味着两者都以一种似乎确认另一个有效的方式失败。

如果不是多个测试,最好有多个断言。

虽然在实际代码中 "check a bunch of different things are each equal" 的便利性可能很方便,但在测试中您不需要 "check a bunch of different things are equal";你想要一个清晰的 "confirm Name is equal" 后跟一个清晰的 "confirm Age is equal" 等等,这不仅是一种测试,而且是对已测试内容的明确指示以及暗示你期望工作的内容(有时对于新开发人员来说,单元测试比书面文档更好,因为他们说的应该如何工作)。

如果您发现您在许多测试中对多个属性进行相同的检查,则将一个 AssertAllPropertiesEqual() 方法添加到测试本身中,但其中包含多个断言,在那里更加明显和明目张胆.

我最近也开始使用 XBehave,它使用 Gherkin 表示法:给定...当...然后...

非常有用,因为它扩展了 XUnit 并允许 Should 断言,例如 Name.ShouldEqual()。

非常可读。

几个断言应该有助于提高可读性,不要尝试优化不能提供明显增益的细节。

不,您必须通过 属性 进行测试(每次测试一个断言),这是在出现问题时弄清楚发生了什么的方法。 例如,如果您有一个名为 When_CopyStuff_Is_Called_Then_It_Must_Sets_Right_Name() 的测试,则可以非常清楚地理解错误,而不是所有属性

这在您需要测试 Api 模型时非常有用。