Express 如果断言失败,异步测试从不调用done()
我试图用mocha+chai+sinon对控制器方法进行单元测试,但我很难理解断言如何与这些异步方法一起工作。这是我的测试: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);
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);
}
});
});
现在,当测试失败时,它会给我正确的错误消息。正如答案所说,我也可以用布尔语,但我认为这样更好
我们仍然非常感谢任何其他解决方案