我目前正在重写一些单元测试以使用NUnit 3而不是NUnit 2,并且需要将一些断言更改为基于约束的断言。我有以下断言:
Assert.IsNullOrEmpty(result);
我已改为:
Assert.That(result, Is.Null.Or.Empty);
但是,在断言IsNotNullOrEmpty
时,我对可读性并不完全满意:
Assert.That(result, Is.Not.Null.And.Not.Empty);
我目前的建议是创建以下静态类:
public static class Text
{
public static EmptyConstraint IsNullOrEmpty => Is.Null.Or.Empty;
public static EmptyConstraint IsNotNullOrEmpty => Is.Not.Null.And.Not.Empty;
}
用法:
Assert.That(result, Text.IsNotNullOrEmpty);
这提供了更好的可读性,但却引入了自定义约束。有没有标准的方法来进行相同的断言,还是应该继续使用Is.Not.Null.And.Not.Empty
?
答案 0 :(得分:15)
Is.Null.Or.Empty
的断言在没有Test
类的情况下完全正常。此外,当这个断言失败时,你确切知道发生了什么:你有一个非空的有效string
对象。
我看到的“DeMorgan-ized”版本的否定(即Is.Not.Null.And.Not.Empty
)的问题是,它太长了,并且它的读取效果不如Is.Null.Or.Empty
那么好。
然而,我不是单独约束它,而是单独断言它的部分,即
Assert.That(result, Is.Not.Null);
Assert.That(result, Is.Not.Empty);
我这样做的原因是两个失败条件不重叠,即result
可能是null
,或者它可能是空的,但它不能同时存在。单个复合断言不区分这两种情况,因此您最终会找一个调试器来查看result
是null
还是空。
另一方面,单独的断言会告诉您在保持可读性的同时发生了什么。他们为每个断言“花费”额外的一行;我认为这是获得有关潜在故障的更准确信息的合理成本。