【发布时间】:2017-10-13 20:40:18
【问题描述】:
我正在尝试使用 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-promised 或 Promise 链,所以我使用了 next()回调(总是使用 restify 调用)来做出断言,这可能是不正确的,所以我愿意进行完整的重构以使这个测试最正确。
提前谢谢你!
【问题讨论】:
标签: express mocha.js sinon chai