I've got a method that may throw an Error, but I'm having trouble writing a SinonJS/Mocha/Should unit test case for this condition.
Sample function under test:
function testError(value) {
if (!value) {
throw new Error('No value');
return false;
}
};
Sample test:
describe('#testError', function() {
it('throws an error', function() {
var spy = sinon.spy(testError);
testError(false);
spy.threw().should.be.true();
});
});
This outputs:
#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)
I was expecting Sinon to catch the Error and allow me to spy on the throw, but it seems to fail the test instead. Any ideas?
I referred to Don't sinon.js spys catch errors? but the only solution there is to use expect
. I'd prefer to keep with a single assertion library if possible.
It appears that this works inside a
try
/catch
:Note that you have to call
fooSpy
, notfoo
itself.But also note that
.should.be.true()
is not part of Sinon, so you're probably already using Chai or a similar library, in which case theexpect(foo).to.have.thrown()
orassert.throws(foo, someError)
syntax seems much nicer.Update: If you're using ShouldJS, looks like you can use
should.throws
. I still think this is nicer than using the Sinon version for this purpose.Revised
Following @nrabinowitz's helpful advice, here's a solution that uses
should.throws
. This avoids usingSinon.spy
altogether.