【问题标题】:Assigning a failure message to expect calls将失败消息分配给期望调用
【发布时间】:2014-07-08 21:10:36
【问题描述】:

我目前正在学习 AngularJS,其中一部分涉及创建测试。目前,我正在尝试研究如何为失败的测试创建更有用的错误消息。例如,如果我在 Java 领域并编写 JUnit 测试,我会做类似这样的事情:

assertTrue( "The foo value should be true at this point", bar.isFoo() );

这样,如果检查失败,我将在日志中获取第一个参数。

对于 mocha 中的布尔检查(使用 chai 和 sinon,以防有所不同)我有...

expect(broadcastSpy.calledWith('order.add')).to.be.true;

如果失败,我会得到以下信息:

expected false to be true
AssertionError: expected false to be true

有没有办法在测试我的应用时复制有用的失败消息?

【问题讨论】:

  • DRY js 测试不是很有用。明确。 it('bar.isFoo() should be true when stuff happens', function() { expect(broadcastSpy.calledWith('order.add')).to.be.true; });
  • 也许我只是没有以非常惯用的方式编写测试,因为我有多个调用期望。
  • 我同意。测试应该是测试。一组测试是一个套件。如果一个成功的测试需要多个断言,它仍然应该有一个简洁的成功/失败标准。

标签: angularjs mocha.js chai


【解决方案1】:

我在 answer 中针对另一个问题提到了一些关于此的内容。我刚刚检查了 Chai 的代码,以确保自从我写下那个答案并发现以下内容仍然正确后没有任何变化。代码:

expect(foo).to.be.true;

不接受自定义消息,因为true 是一个通过getter 获取其值的属性。但是,您可以这样做:

expect(foo).to.equal(true, "foo should be true");

在断言失败时获取自定义消息。

Chai 的断言接口支持所有断言的消息,例如:

assert.isTrue(foo, "foo should be true");

【讨论】:

  • 谢谢!我怀疑我的测试会变得有点混合风格,直到我决定我认为是唯一的真正方式! :)
【解决方案2】:

我只是偶然发现了一个可能更令人满意的答案:expect 可以将消息作为第二个参数,如下所示:

expect(foo, 'foo should be true').to.be.true;

这会呈现以下输出(如果 foofalse):

AssertionError: foo should be true: expected false to be true

来源:参见Chai documentation - 搜索文本“消息也可以作为expect 的第二个参数给出。”

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多