我正在尝试使用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()
导致一般性的失败只会导致'测试失败,因为从未调用过',这与测试失败的原因无关。
如果我保持这样的测试并且我的控制器方法做的一切都很好,测试通过并且一切正常,但如果控制器做错了什么,测试失败并且没有告诉我失败的原因(应该“res.json
没有用bla bla bla参数调用”。
我也不确定这是单元测试控制器方法的正确方法,因为它们不返回Promise我根本不能使用chai-as-promise或promise chain,所以我使用{{1回调(总是用restify调用)来做出断言,这可能不对,所以我打开一个完整的重构来使这个测试最正确。
提前谢谢!
答案 0 :(得分:1)
进一步挖掘我在其他问题中找到了这个答案: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);
}
});
});
现在,当测试失败时,它会给我正确的错误消息。正如答案所说,我也可以用布尔语来做,但我认为这样做更好。
仍然非常感谢任何其他解决方案。