Jasmine: test a setTimeout function throws an erro

2019-06-24 03:54发布

问题:

I would like to test the error handling of a method, which schedules work with setTimeout. The error will be thrown in the scheduled part, i.e.:

function sutWithSetTimeout() {
    setTimeout(function () { throw new Error("pang"); }, 1);
}

How do I test that an error is thrown and that it has the correct message?

回答1:

You need to catch the function in the setTimeout and call them using expect(function(){fn();}).toThrow(e);. So you can spy on setTimeout to get the function:

spyOn(window, 'setTimeout');
sutWithSetTimeout();
var fn = window.setTimeout.mostRecentCall.args[0];
expect(fn).toThrow('pang');