提高可靠性以使用基于约束的断言来声明IsNotNullOrEmpty

时间:2016-04-07 15:55:54

标签: c# unit-testing nunit nunit-3.0

我目前正在重写一些单元测试以使用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

1 个答案:

答案 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,或者它可能是空的,但它不能同时存在。单个复合断言不区分这两种情况,因此您最终会找一个调试器来查看resultnull还是空。

另一方面,单独的断言会告诉您在保持可读性的同时发生了什么。他们为每个断言“花费”额外的一行;我认为这是获得有关潜在故障的更准确信息的合理成本。