了解单元测试约束和NUnit语法助手

时间:2009-03-04 10:24:18

标签: unit-testing nunit constraints

我和一位同事正在开始一个新项目并试图充分利用TDD。我们仍在研究有关单元测试的所有概念,因此它们主要基于其他示例。

我的同事最近对NUnit语法助手的问题提出了质疑,我正在努力解释他们的好处(因为我自己并不是真的了解它,除了我的直觉说他们很好!)。这是一个示例断言:

Assert.That(product.IsValid(), Is.False);

对我来说这完全合情合理,我们说我们希望product.IsValid()的价值为false。另一方面,我的同事宁愿我们简单地写一下:

Assert.That(!product.IsValid());

他对他说这更有意义,他可以更容易阅读。

到目前为止,我们唯一能够达成共识的是,当测试失败时,你可能会获得更多有用的输出,但我认为必须有更好的解释。我已经查找了有关语法助手(http://nunit.com/blogs/?p=44)的一些信息并且它们有意义,但我并不完全理解约束的概念,除了它们“感觉”正确。

我想知道是否有人可以解释为什么我们使用约束的概念,以及为什么它们会改进上面的单元测试示例?

感谢。

4 个答案:

答案 0 :(得分:4)

我认为这主要与纯正的英语阅读声明有关。

第一次读取

  

断言产品有效是

第二次读取

  

断言产品无效

我个人觉得第一个更容易处理。我认为这完全取决于偏好。有些扩展方法很有意思,但是你可以使用这样的断言:

product.IsValid().IsFalse();

答案 1 :(得分:3)

我可以看到你的版本比你的同事更好。但是,我仍然至少对以下内容感到满意:

Assert.IsFalse(product.IsValid());

如果你能说服我Assert.That语法比上面有客观的好处,我会非常感兴趣:)这可能只是习惯的力量,但我可以很容易地读到“什么样的我们在做什么断言?现在我们断言它是什么?“风格。

答案 2 :(得分:1)

这都是糖。在内部,他们被转换为约束。

从语用单位测试,第37页:

“NUnit 2.4引入了一种新的断言方式,它的程序性稍差,并允许更面向对象的底层实现。 ... 例如:

Assert.That(actual, Is.EqualTo(expected));

转换为:

Assert.That(actual, new EqualConstraint(expected));"

使用约束还允许您从Constraint继承并创建自己的自定义约束,同时保持一致的语法。

答案 3 :(得分:0)

我不喜欢Assert。特别是它最常见的场景(比较两个对象的相等)比'经典'Assert.AreEqual()语法更糟糕。

另一方面,我非常喜欢MSpec NUnit扩展。我建议你检查它们(或查看SpecUnit扩展,或NBehave扩展,或N Behave 规范*单元扩展,我认为它们都是一样的。)