【发布时间】:2010-06-15 21:33:55
【问题描述】:
难道不是每个断言语句都可以翻译成 Assert.IsTrue,因为根据定义,您是在断言某事是真还是假?
为什么测试框架会引入 AreEquals、IsNotNull 等选项,尤其是 IsFalse?我觉得我在编写单元测试时花了太多时间考虑使用哪个 Assert。
【问题讨论】:
标签: c# .net visual-studio unit-testing nunit
难道不是每个断言语句都可以翻译成 Assert.IsTrue,因为根据定义,您是在断言某事是真还是假?
为什么测试框架会引入 AreEquals、IsNotNull 等选项,尤其是 IsFalse?我觉得我在编写单元测试时花了太多时间考虑使用哪个 Assert。
【问题讨论】:
标签: c# .net visual-studio unit-testing nunit
如果您愿意,您可以一直使用Assert.IsTrue。不同的是Assert.AreEqual之类的东西会在断言失败时给你更好的错误信息。
NUnit(可能还有其他框架)现在支持如下语法:
Assert.That(foo, Is.Equal.To(bar))
【讨论】:
AreEqual优雅地处理空值了。
如果您有足够的额外代码,是的,几乎每个Assent.XXX 都可以转换为Assert.IsTrue 调用。但是有一些很难翻译,比如 Throws
Assert.Throws<ArgumentNullException>(() => x.TestMethod(null));
将其转换为Assert.IsTrue 是可能的,但真的不值得努力。使用Throws 方法要好得多。
【讨论】:
是的,
AreEqual(obj1, obj2) 基本上是 Assert.IsTrue(obj1.Equals(obj2))。所以,我会说这是真的。
但也许他们为了可读性而引入了这些重载,例如,很明显他们想要比较两个对象,或者检查一个值是否等于 false。
【讨论】:
这很简单 - 让您的测试代码更具可读性。
哪个更易读
Assert.IsTrue(quantity > 0)
或
Assert.That(quantity, Is.GreaterThan( 0 ))
你不觉得第二个选项更具可读性吗?
【讨论】:
您可以使用一个名为 Should 的库来编写与框架无关的断言。它还具有非常好的流畅语法,如果您喜欢流畅的界面,可以使用它。我有一篇与此相关的博客文章。
http://nileshgule.blogspot.com/2010/11/use-should-assertion-library-to-write.html
【讨论】: