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