我有一个可能会抛出错误的方法,但是我在编写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
。如果可能的话,我更愿意使用单个断言库。
答案 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);
});
});
});