为什么这个异步Jasmine测试失败了?

时间:2015-12-02 15:56:42

标签: javascript unit-testing jasmine

为什么这个测试失败了,说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",这意味着间谍被调用并且它通过了。

1 个答案:

答案 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,则测试将通过。