首页  >  文章  >  web前端  >  为什么我的 Mocha/Chai `expect.to.throw` 断言无法捕获抛出的错误?

为什么我的 Mocha/Chai `expect.to.throw` 断言无法捕获抛出的错误?

DDD
DDD原创
2024-11-18 03:02:02415浏览

Why Does My Mocha/Chai `expect.to.throw` Assertion Fail to Catch Thrown Errors?

Mocha/Chai Expect.to.throw 谜题:捕获抛出的错误

Chai 的 Expect.to.throw 断言在捕获方面似乎难以捉摸正确抛出错误。尽管编写了测试用例,但使用 Expect.to.throw 的断言还是反复失败。

为了澄清这一点,让我们考虑以下代码片段:

it('should throw an error if you try to get an undefined property', function (done) {
  var params = { a: 'test', b: 'test', c: 'test' };
  var model = new TestModel(MOCK_REQUEST, params);

  expect(model.get('z')).to.throw('Property does not exist in model schema.');
  expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
});

事实证明,问题的症结在于问题在于我们将表达式传递给expect.to.throw的方式。

解决方案:包装函数

为了纠正这个问题,我们需要将一个函数传递给expect.to.throw,它随后将调用该函数。以下调整后的代码现在将按预期工作:

it('should throw an error if you try to get an undefined property', function (done) {
  var params = { a: 'test', b: 'test', c: 'test' };
  var model = new TestModel(MOCK_REQUEST, params);

  expect(model.get.bind(model, 'z')).to.throw('Property does not exist in model schema.');
  expect(model.get.bind(model, 'z')).to.throw(new Error('Property does not exist in model schema.'));
});

通过使用绑定方法,我们创建一个新函数,在调用时,将调用 model.get 并将此设置为 model 并设置初始参数到 'z'。

绑定说明

在这种情况下,绑定起着至关重要的作用 角色。它生成一个新函数,该函数接受与原始函数相同的参数,但在调用时具有特定的值。在我们的例子中,this 值为 model,参数为 'z'。

当我们将 model.get('z') 的结果传递给 Expect.to.throw 时,我们实际上传递了抛出的断言错误。然而,expect.to.throw的目的是检查给定函数在调用时是否抛出异常。因此,我们必须传递函数本身而不是它的结果。绑定方法使我们能够做到这一点。

要更深入地了解绑定,请参阅提供的链接。

以上是为什么我的 Mocha/Chai `expect.to.throw` 断言无法捕获抛出的错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn