javascript - Mocha/Chai expect.to.throw 没有捕捉到抛出的错误

标签 javascript node.js mocha.js chai

我在让 Chai 的 expect.to.throw 在我的 node.js 应用程序测试中工作时遇到问题。测试在抛出的错误上一直失败,但是如果我将测试用例包装在 try 中并捕获并断言捕获的错误,它就可以工作。

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);

  // neither of these work
  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.'));

  // this works
  try { 
    model.get('z'); 
  }
  catch(err) {
    expect(err).to.eql(new Error('Property does not exist in model schema.'));
  }

  done();
});

失败:

19 passing (25ms)
  1 failing

  1) Model Base should throw an error if you try to get an undefined property:
     Error: Property does not exist in model schema.

最佳答案

你必须将一个函数传递给expect。像这样:

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('z')result 传递给 expect。但是要测试是否有东西被抛出,你必须将一个函数传递给 expectexpect 会调用它自己。上面使用的 bind 方法创建了一个新函数,该函数在调用时将调用 model.get 并将 this 设置为 model< 的值 并且第一个参数设置为 'z'

bind的一个很好的解释可以找到here .

关于javascript - Mocha/Chai expect.to.throw 没有捕捉到抛出的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21587122/

相关文章:

node.js - 测试 AngularJS Express Node 应用程序

javascript - jQuery 检查表单中所有必需的输入是否不为空

javascript - 在 JavaScript 中声明数组的方式是什么?

node.js - node.js 的 acl 库

node.js - 仅对 Node 中的 chai-http 单元测试进行 1 个 http 调用?

node.js - 指定乐观/极简命令行选项,无论是通过 Node、Nodemon 还是 Istanbul/Mocha 执行,这些选项都同样可用于 Node 应用程序

javascript - 通过代码打开 Chrome Inspector 来捕获快速断点?

javascript - 在 url 路径中使用通配符的 Node.js 和 Websocket

从 Jade 文件调用时,Javascript 脚本将文档中的所有 id 引用为未定义

node.js - 使用 Jenkins、selenium-grid 和 Protractor 进行 e2e 测试