增加可读性以使用基于约束的断言来断言IsNotNullOrEmpty

Tor*_*son 14 c# nunit unit-testing nunit-3.0

我目前正在重写一些单元测试以使用NUnit 3而不是NUnit 2,并且需要将一些断言更改为基于约束的断言.我有以下断言:

Assert.IsNullOrEmpty(result);
Run Code Online (Sandbox Code Playgroud)

我改为:

Assert.That(result, Is.Null.Or.Empty);
Run Code Online (Sandbox Code Playgroud)

但是,断言时我对可读性并不完全满意IsNotNullOrEmpty:

Assert.That(result, Is.Not.Null.And.Not.Empty);
Run Code Online (Sandbox Code Playgroud)

我目前的建议是创建以下静态类:

public static class Text
{
    public static EmptyConstraint IsNullOrEmpty => Is.Null.Or.Empty;

    public static EmptyConstraint IsNotNullOrEmpty => Is.Not.Null.And.Not.Empty;
}
Run Code Online (Sandbox Code Playgroud)

用法:

Assert.That(result, Text.IsNotNullOrEmpty);
Run Code Online (Sandbox Code Playgroud)

这提供了更好的可读性,但代价是引入了自定义约束.是否存在制定相同断言的标准方法,还是应该继续使用Is.Not.Null.And.Not.Empty

das*_*ght 18

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);
Run Code Online (Sandbox Code Playgroud)

我这样做的原因是两个失败条件不重叠,即result可能是null,或者它可能是空的,但它不能同时是两个.单个复合断言不区分这两种情况,因此您最终会找一个调试器来查看是否resultnull空.

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