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

时间:2017-10-13 20:40:19

标签: express mocha 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);

  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调用)来做出断言,这可能不对,所以我打开一个完整的重构来使这个测试最正确。

提前谢谢!

1 个答案:

答案 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);
    }
  });
});

现在,当测试失败时,它会给我正确的错误消息。正如答案所说,我也可以用布尔语来做,但我认为这样做更好。

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

相关问题