异步测试从来没有调用完成()如果断言失败
问题描述:
我想单元测试与摩卡+ 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()
,导致一个通用的失败告诉没有比'测试失败,因为完成从来没有被称为',其中没有说与测试失败的原因没有关系。
如果我保持这样的测试,并且我的控制器方法做得很好,测试通过并且一切正常,但是如果控制器做了任何错误,测试失败并且不会告诉我失败的原因(哪个应该是“res.json
没有用bla bla bla参数调用”)。
我也不确定这是单元测试控制器方法的正确方法,因为它们不会返回Promise我不能使用chai-as-promised或promise链,所以我使用了next()
回调函数(它总是使用restify调用)来做出断言,这可能是不对的,所以我打开一个完整的重构来使这个测试最正确。
预先感谢您!
答
挖一点点,我发现其他问题这样的回答:https://stackoverflow.com/a/26793989/4233017
所以我更新了我的代码,并包裹在一个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);
}
});
});
现在当测试失败时,它会给我正确的错误信息。如果答案是这样,我也可以用布尔值来做到这一点,但我认为这样更好。
任何其他解决方案仍然非常感激。