使用SinonJS捕获抛出的错误

时间:2015-10-01 17:19:47

标签: node.js unit-testing mocha 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能够抓住错误并允许我对投掷进行间谍活动,但似乎没有通过测试。有什么想法吗?

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

2 个答案:

答案 0 :(得分:10)

这似乎适用于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版本更好。

答案 1 :(得分:3)

<强>修

根据@ nrabinowitz的有用建议,这是一个使用should.throws的解决方案。这样可以避免完全使用Sinon.spy

describe('#testError', function() {
  it('throws an error', function() {
    should.throws(function() {
      testError(false);
    });
  });
});