在xUnit中,有没有办法只对特定属性断言?
对于给定的实用程序类方法
public static CopyStuff(Oder o1, Order o2)
{
o1.Name = o2.Name;
o1.Age = o2.Age;
...
}
有没有办法只在这两个或多个属性上断言? 而不是编写多个断言?
我想
// Something like this
Assert(result, o2, [Name, Age, Blah..])
如果相关类实现了适当的自定义Equals()
,或者它是结构(默认情况下Equals()
进行逐字段比较(或匿名类型(Equals()
进行逐个属性比较(,那么您可以断言它们在单个断言中是相等的。
不过,这将是一个坏主意;复制和相等操作中都可能存在一个相关的错误,这意味着两者都失败了,以至于一个似乎确认另一个已经工作。
如果不是多个测试,最好有多个断言。
虽然在实际代码中,"检查一堆不同的东西是否相等"的便利性可能很方便,但在测试中,你不希望"检查一堆不同的东西是否相等";你想要一个明确的"确认名称是相等的",然后是一个明确的"确认年龄是相等的"等等,而不仅仅是一个测试, 但作为已经测试的内容的明确指示,并暗示您期望工作的内容(有时单元测试比对新开发人员的书面文档更好,他们说的东西应该如何工作(。
如果您发现在许多测试中对多个属性执行相同的检查,则将AssertAllPropertiesEqual()
方法添加到测试本身中,但其中的多个断言更加明显和明显。
不,并非不使用反射。 即使有反思,我也不会推荐这种方法。 单元测试应该有利于可读性而不是简洁。 只需使用多个断言。
另外,看看xUnit测试,看看它们是如何实现的。
我最近也开始使用使用小黄瓜表示法的XBehave:给定...什么时候。。。然后。。。
非常有用,因为它扩展了XUnit并允许Should断言,例如Name.ShouldEqual((。
非常可读。
几个断言应该有助于提高可读性,不要试图优化不能提供明显收益的细节。
不,您必须按属性进行测试(每个测试一个断言(,这是弄清楚如果出现问题会发生什么的方法。对于意图,如果您有一个名为 When_CopyStuff_Is_Called_Then_It_Must_Sets_Right_Name(( 的测试,则非常清楚地了解错误而不是所有属性
当您需要测试 API 模型时,这非常有用。