41

更喜欢什么:

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

或者

Assert.True(obj.Foo)

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

4

4 回答 4

23

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

Assert.IsTrue(obj.Foo);

Assert.That(obj.Foo, Is.True);

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

于 2013-04-18T15:23:38.463 回答
13

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

那是设计问题。正如大家所说,无论您做什么,仍然需要提供体面的错误消息反馈。

于 2013-04-18T16:04:08.430 回答
7

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

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

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

Assert.True(obj.Foo)

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

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

于 2013-04-18T15:34:57.137 回答
5

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

为了更挑剔一点,我建议使用Assert.IsTrueAPI 而不是Assert.True因为,恕我直言,IsTrue“阅读”更好。

于 2013-04-18T15:26:13.020 回答