使用基于约束的断言提高断言 IsNotNullOrEmpty 的可读性
Increase readability to assert IsNotNullOrEmpty with constraint-based asserts
我目前正在重写一些单元测试以使用 NUnit 3 而不是 NUnit 2,并且需要将一些断言更改为基于约束的断言。我有以下断言:
Assert.IsNullOrEmpty(result);
我已经更改为:
Assert.That(result, Is.Null.Or.Empty);
但是,我对断言 IsNotNullOrEmpty
:
的可读性并不完全满意
Assert.That(result, Is.Not.Null.And.Not.Empty);
我目前的建议是创建以下静态 class:
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
来代替?
你对 Is.Null.Or.Empty
的断言在没有 Test
class 的情况下读起来完全没问题。此外,当此断言失败时,您确切地知道发生了什么:您得到了一个有效的 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
还是空的。
另一方面,单独的断言可以准确地告诉您发生了什么,同时保持可读性。他们 "cost" 你每个断言多一行;我认为这是获得有关潜在故障的更精确信息的合理成本。
我目前正在重写一些单元测试以使用 NUnit 3 而不是 NUnit 2,并且需要将一些断言更改为基于约束的断言。我有以下断言:
Assert.IsNullOrEmpty(result);
我已经更改为:
Assert.That(result, Is.Null.Or.Empty);
但是,我对断言 IsNotNullOrEmpty
:
Assert.That(result, Is.Not.Null.And.Not.Empty);
我目前的建议是创建以下静态 class:
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
来代替?
你对 Is.Null.Or.Empty
的断言在没有 Test
class 的情况下读起来完全没问题。此外,当此断言失败时,您确切地知道发生了什么:您得到了一个有效的 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
还是空的。
另一方面,单独的断言可以准确地告诉您发生了什么,同时保持可读性。他们 "cost" 你每个断言多一行;我认为这是获得有关潜在故障的更精确信息的合理成本。