【问题标题】:Increase readability to assert IsNotNullOrEmpty with constraint-based asserts使用基于约束的断言提高断言 IsNotNullOrEmpty 的可读性
【发布时间】:2023-03-04 21:35:01
【问题描述】:

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

【问题讨论】:

  • 这个问题可以客观回答。编辑正文,以非主观的方式重述问题;投票重新开放。

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


【解决方案1】:

如果没有 Test 类,您对 Is.Null.Or.Empty 的断言读起来非常好。此外,当这个断言失败时,您确切地知道发生了什么:您有一个不为空的有效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 还是空。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多