Express 如果断言失败,异步测试从不调用done()

Express 如果断言失败,异步测试从不调用done(),express,mocha.js,sinon,chai,Express,Mocha.js,Sinon,Chai,我试图用mocha+chai+sinon对控制器方法进行单元测试,但我很难理解断言如何与这些异步方法一起工作。这是我的测试: it('should fetch all registered books and send them as json', (done) => { res.json = sandbox.spy(); const books = []; BookMock.expects('find').withArgs() .resolves(books);

我试图用mocha+chai+sinon对控制器方法进行单元测试,但我很难理解断言如何与这些异步方法一起工作。这是我的测试:

it('should fetch all registered books and send them as json', (done) => {
  res.json = sandbox.spy();
  const books = [];

  BookMock.expects('find').withArgs()
    .resolves(books);

  booksController.index(req, res, () => {
    res.json.should.have.been.calledWith(200, { data: books });
    done();
  });
});
这个测试的问题是,如果我更改断言以期望一个
300
而不是
200
参数,例如,我的测试将停止(失败),并且永远不会调用
done()
,这将导致一个通用的失败,它只告诉我们“测试失败,因为从未调用过done”,这与测试失败的原因无关

如果我保持这样的测试,我的控制器方法做得很好,测试通过,一切正常,但是如果控制器做了任何错误,测试失败,并且没有告诉我失败的原因(应该是“
res.json
没有使用bla-bla-bla参数调用”)

我也不确定这是单元测试控制器方法的正确方法,因为它们不返回承诺,我根本不能使用chai作为承诺或承诺链,所以我使用
next()
回调(总是使用restify调用)来进行断言,这可能不对,因此,我愿意进行全面重构,以使此测试最正确


提前谢谢你

再深入一点,我在另一个问题中找到了这个答案:

因此,我更新了代码并将断言包装在try/catch中,结果如下:

it('should fetch all registered books and send them as json', (done) => {
  res.json = sandbox.spy();
  const books = [];

  BookMock.expects('find').withArgs()
    .resolves(books);

  booksController.index(req, res, () => {
    try {
      res.json.should.have.been.calledWith(200, { data: books });
      done();
    } catch (e) {
      done(e);
    }
  });
});
现在,当测试失败时,它会给我正确的错误消息。正如答案所说,我也可以用布尔语,但我认为这样更好

我们仍然非常感谢任何其他解决方案