使用 SinonJS 捕获抛出的错误

Catching thrown errors with SinonJS

我有一个可能会抛出错误的方法,但我无法为这种情况编写 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)

我原以为诗乃能捕捉到错误并让我窥探投掷,但它似乎没有通过测试。有什么想法吗?

我提到了 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 版本更好。

修订

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

describe('#testError', function() {
  it('throws an error', function() {
    should.throws(function() {
      testError(false);
    });
  });
});
            const bootstrap = async anyParam => {
                if(!anyParam){
                    throw new Error('test')
                }

                await anyParam()
            }

            const spy = sinon.spy(bootstrap)

            try {
                await spy();
            } catch (e) {
                expect(e.message).to.be.equal('test')
                spy.called = false
            }

            expect(spy.called).to.be.equal(false);