测试异步代码时如何检查Mocha中的断言错误

时间:2015-05-31 18:52:13

标签: node.js mocha

当使用Mocha测试异步代码并且我的一个断言失败时,所有Mocha都会报告超时错误。有没有办法改善这个?如何知道断言失败的原因以及原因?

mocha

  Contact
    #getContacts()
      1) should return at least 1 contact


  0 passing (3s)
  1 failing

  1) Contact #getContacts() should return at least 1 contact:
     Error: timeout of 3000ms exceeded. Ensure the done() callback is being called in this test.

代码:

var assert         = require("assert");
var contact        = require("../lib/contact.js");
var chai           = require('chai');
var should         = chai.should();

describe('Contact', function() {
  describe('#getContacts()', function() {
    it('should return at least 1 contact', function(done) {
      contact.getContacts().then(function(contacts) {
        assert.equal(4,2)

        done()
      });
    })
  })
});

3 个答案:

答案 0 :(得分:6)

问题是断言失败,抛出异常。这导致承诺被拒绝,但没有人注意到。您的代码仅检查承诺是否成功。如果您返回承诺,那么如果承诺被拒绝,则mocha将检查它并且未通过测试。

所以你想要

it('should return at least 1 contact', function() {
    return contact.getContacts().then(function(contacts) {
      assert.equal(4,2);
    });
}); 

答案 1 :(得分:2)

你应该回复这样的承诺:

it('should return at least 1 contact', function() {
  return contact.getContacts().then(function(contacts) {
    assert.equal(4,2);
  });
});

答案 2 :(得分:1)

似乎当assert抛出错误时,吞下错误并且从未显示错误,并且跳过断言抛出后的代码。

尝试这样(抓住拒绝):

Article

或者代替那时(null,rejectFunc)使用catch(rejectFunc)和像bluebird这样的库。

idbehold的答案也很棒。我还不知道mocha直接支持promises并且我总是使用done param知道如果我没有堆栈跟踪超时,那么在这个测试中有一个吞没错误。