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

How to check assertion error in Mocha when testing async code

当使用 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()
      });
    })
  })
});

你应该return这样的承诺:

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

似乎当 assert 抛出错误时,错误被吞没并且从未显示,而且 assert throws 之后的代码也被跳过。

像这样尝试(捕获拒绝):

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

    done()
  }).then(null, function (err) {
    console.error(err);

    done(err);
  });
})

或者使用 catch(rejectFunc) 而不是 then(null, rejectFunc) 和像 bluebird 这样的库。

idbehold 的回答也很棒。我还不知道 mocha 直接支持 promises 并且我总是使用 done 参数知道我是否有没有堆栈跟踪的超时在这个测试中有一个被吞噬的错误。

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

所以你想要

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