c# - 使用基于约束的断言提高断言 IsNotNullOrEmpty 的可读性

标签 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 来代替?

最佳答案

您对 Is.Null.Or.Empty 的断言在没有 Test 类的情况下读起来完全没问题。此外,当此断言失败时,您确切地知道发生了什么:您得到了一个有效的非空的 string 对象。

我看到它的否定的“DeMorgan 化”版本的问题,即 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 还是空的。

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

关于c# - 使用基于约束的断言提高断言 IsNotNullOrEmpty 的可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36481382/

相关文章:

c# - 为什么短路不能阻止与逻辑 AND (&&) 的不可到达分支相关的 MissingMethodException?

java - 测试 Jersey 客户端包装器

使用 Jasmine 进行 Angular 单元测试 - 错误 : Please add an @NgModule annotation

c# - Xamarin.UITest REPL。如何从 ListView 元素获取对象列表?

c# - 在 C# 中对同一结果进行多个断言的最佳实践

azure-devops - 此项目引用此计算机上缺少的 NuGet 包。丢失的文件是 ..\packages\NUnit.3.10.1\build\NUnit.props

c# - asp.net 从数据集中获取单个值

c# - ASP.NET ListView 填充

unit-testing - 测试 RxJava : AdvanceTime not working in simple deferred flowable

c# - Linq 和 IEnumerable 惰性查询。效率损失?