node.js - 使用 SinonJS 捕获抛出的错误

标签 node.js unit-testing mocha.js sinon should.js

我有一个可能会抛出错误的方法,但我无法为这种情况编写 SinonJS/Mocha/Should 单元测试用例。

被测函数示例:

function testError(value) {
  if (!value) {
    throw new Error('No value');
    return false;
  }
};

示例测试:

describe('#testError', function() {
  it('throws an error', function() {
    var spy = sinon.spy(testError);
    testError(false);
    spy.threw().should.be.true();
  });
});

这个输出:

  #testError
    1) throws an error


  0 passing (11ms)
  1 failing

  1) #testError throws an error:
     Error: No value
      at testError (tests/unit/js/test-error.js:6:14)
      at Context.<anonymous> (tests/unit/js/test-error.js:14:6)

我原以为 Sinon 会捕捉到错误并允许我监视 throw ,但它似乎没有通过测试。有什么想法吗?

我提到了 Don't sinon.js spys catch errors?但唯一的解决方案是使用 expect。如果可能的话,我更愿意使用单个断言库。

最佳答案

这似乎在 try/catch 中起作用:

function foo() { throw new Error("hey!"); }
var fooSpy = sinon.spy(foo);
try {
  fooSpy();
} catch (e) {
  // pass
}
assert(fooSpy.threw());

请注意,您必须调用 fooSpy而不是 foo 本身。

但还要注意 .should.be.true() 不是 Sinon 的一部分,因此您可能已经在使用 Chai 或类似的库,其中如果 expect(foo).to.have.thrown()assert.throws(foo, someError) 语法看起来更好。

更新:如果您使用的是 ShouldJS,看起来您可以使用 should.throws .我仍然认为这比为此目的使用 Sinon 版本更好。

关于node.js - 使用 SinonJS 捕获抛出的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893279/

相关文章:

ruby-on-rails - 如何 stub 事件记录关系以使用 rspec 测试 where 子句?

android - 仪器化测试

node.js - 是否可以从 package.json 脚本设置 dotenv 变量?

javascript - 如何使用 mocha、promise 和 catch block 防止误报

electron - 如何使用 Mocha 测试需要 Node API 的自定义模块? "Cannot read property ' 需要'未定义的"

node.js - express.js 套接字池

node.js - 在生产中禁用 EJS 缓存

android - 如何为 Android 单元测试定义 Mock Cursor

apache - 对于在 Node.JS 上运行的 SaaS,是否需要 Web 服务器 (nginx) 或清漆作为反向代理?

javascript - setInterval() 函数在控制台上运行,但在一次 api 命中后,数据在浏览器上没有更新