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中文网其他相关文章!