Assert.That vs Assert.True

时间:2013-04-18 15:19:50

标签: c# unit-testing nunit

更喜欢什么:

Assert.That(obj.Foo, Is.EqualTo(true))

Assert.True(obj.Foo)

对我来说,两个断言都是等价的,那么应该首选哪一个?

4 个答案:

答案 0 :(得分:17)

在这种特殊情况下,没有区别:您将看到大致相同的详细程度的输出(即它告诉您预期评估为true的内容已评估为{{1} })。同样适用于

false

Assert.IsTrue(obj.Foo);

您的团队应选择一种断言方式,并在所有测试中坚持使用。如果您的团队更喜欢Assert.That(obj.Foo, Is.True); 样式,那么您应该使用Assert.That

答案 1 :(得分:11)

Assert.That被称为基于约束的模型。它很灵活,因为该方法采用IConstraint类型的参数。这意味着您可以使用更通用的层次结构或调用结构来构建代码,并传入任何旧的IConstraint。这意味着您可以构建自己的custom constraints

这是一个设计问题。正如大家所说,无论你还需要提供体面的错误信息反馈。

答案 2 :(得分:4)

好的,你在CI服务器上执行了测试套件,不幸的是,其中一个失败了。您打开日志并查看下一条消息

BusinessLogicTests.LoginTests.UserAutoLoginTests failed: expected true but was false

现在你怎么会得到这些测试发生的错误,如果你看到的所有信息都是AutoLoginTests bool中的某个地方预期是真的,但收到了错误?现在您需要转到测试用例的源文件,看看断言失败了什么。你看

Assert.True(obj.Foo)

令人惊讶的是......只有在1小时前开发此模块时,仍然很难分辨出什么是错的。你仍然需要深入研究测试源和可能的生产源,甚至调试你的代码,这样你最终可以弄清楚,你在函数调用中错误拼写了一个变量,或者使用了错误的谓词来过滤注册用户。因此,您阻止了测试的即时反馈,这非常有价值。

我的观点是,你的断言是多么流利(这也是相关的)并不重要,但是在测试失败的情况下你会暴露什么信息,以及你有多快得到失败的根本原因,即使你工作了很久以前有这个功能

答案 3 :(得分:2)

这有点挑剔,但恕我直言,我认为在这种情况下Assert.That是不必要的冗长,因此可以被视为混淆。换句话说,Assert.True更清晰,更直接,更容易阅读,因此可以理解。

为了获得更多挑剔,我建议使用Assert.IsTrue API代替Assert.True,因为恕我直言,IsTrue“更好”。