11

我需要测试这个功能:

   //user.js
    function getUser(req, res, next){
    helper.get_user(param1, param2, (err, file) => {
        if (err) return next(err);
    }

这是我的测试功能:

it ("failed - helper.get_user throws error", sinon.test(function () {
    var req, res;
    var get_user = this.stub(helper, "get_user")
    get_user.yields(new Error("message"));
    var next = sinon.spy(next);
    user.get_user(req, res, next);
    expect(next).to.have.been.calledWith(new Error("other message"));
}))

对于我的断言,我使用的是sinon-chai语法。

尽管我预计它会失败,但该测试正在通过,因为我的代码不会抛出带有错误的消息。

如何测试错误是否引发了正确的消息?

4

3 回答 3

13

我通常做的是:

const next = stub();
someMiddleware(req, res, next);
expect(next).to.have.been.called();
const errArg = next.firstCall.args[0];
expect(errArg).to.be.instanceof(Error);
expect(errArg.message).to.equal("Your message");

请注意,我使用脏柴是为了对 eslint 友好。

高温下,

于 2017-05-03T21:31:13.967 回答
12

由于您使用的是 Sinon,因此您还可以利用matchers。例如:

const expectedErr = { message: 'Your message' }

sinon.assert.calledWith(next, sinon.match(expectedErr))

这将检查一个普通的对象。更精确的检查是

const expectedErr = sinon.match.instanceOf(Error)
  .and(sinon.match.has('message', 'Your message'))

sinon.assert.calledWith(next, sinon.match(expectedErr))

查看这个 GitHub 问题以获取更多详细信息。

于 2018-06-19T16:51:05.750 回答
1

补充@Alex响应的更完整示例:

expect(next).to.have.been.calledWith(
  sinon.match.instanceOf(Error)
    .and(sinon.match.has(
      'message',
      'Some message',
    )
  )
);
于 2021-09-04T00:37:37.763 回答