为什么这个测试失败了,说onSuccess
间谍从未被调用过?
it('should correctly call the success callback',function(done)
{
const callbacks={
onSuccess:function()
{
console.log('OK');
done();
},
onError:function()
{
console.log('ERR');
done();
}
};
spyOn(callbacks,'onSuccess').and.callThrough();
spyOn(callbacks,'onError').and.callThrough();
doSomethingAsync(callbacks.onSuccess,callbacks.onError);
expect(callbacks.onSuccess).toHaveBeenCalled();
expect(callbacks.onError).not.toHaveBeenCalled();
});
运行测试时,我收到错误Expected spy onSuccess to have been called.
正好在那之上,有一个控制台日志说" OK",这意味着间谍被调用并且它通过了。
答案 0 :(得分:1)
很难断言一个回调被调用而另一个回调不是没有存根doSomethingAsync
或其内部。
这是一个人为的边缘案例:
function doSomethingAsync(onSuccess, onError) {
setTimeout(function() {
onSuccess('hello');
}, 500);
setTimeout(function() {
onError(new Error('foo'));
}, 1000);
}
(所以它会在半秒后调用onSuccess
,并在一秒后调用onError
如果你在onSuccess
处理程序中断言onError
尚未被调用,则测试将通过,即使onError
被调用(虽然半秒钟后)。
这是你不能轻易解决的问题,除非(如前所述)你存根({1}}的内部。
如果您只是想测试doSomethingAsync
是否调用了正确的处理程序,您可以将测试用例缩短到此(前提是不必严格调用doSomethingAsync
对象中的处理程序):< / p>
callbacks
(这不会抓住it('should correctly call the success callback',function(done) {
doSomethingAsync(done, done.fail);
});
调用两个处理程序;如果它在doSomethingAsync
之前调用onSuccess
,则测试将通过。