【问题标题】:Async test never calls done() if assertion fails [duplicate]如果断言失败,异步测试永远不会调用 done() [重复]
【发布时间】: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


    【解决方案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);
        }
      });
    });
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-04
      • 2021-08-08
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多