为什么这个异步茉莉花测试失败

Why is this async Jasmine test failing?

本文关键字:测试 失败 茉莉花 异步 为什么      更新时间:2023-09-26

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

很难断言一个回调被调用,而另一个回调不是没有存根doSomethingAsync或其内部。

这是一个人为的边缘情况:

function doSomethingAsync(onSuccess, onError) {
  setTimeout(function() {
    onSuccess('hello');
  }, 500);
  setTimeout(function() {
    onError(new Error('foo'));
  }, 1000);
}

(所以它在半秒后调用onSuccess,一秒后调用onError(

如果在 onSuccess 处理程序中断言尚未调用onError,则测试将通过,即使调用onError(尽管半秒后(。

这是您无法轻松解决的问题,除非(如前所述(您将存根(内部(doSomethingAsync

如果您只想测试doSomethingAsync是否调用正确的处理程序,则可以将测试用例缩短为以下内容(前提是在callbacks对象中调用处理程序并非绝对必要(:

it('should correctly call the success callback',function(done) {
  doSomethingAsync(done, done.fail);
});

(不过,这不会捕获doSomethingAsync调用两个处理程序;如果它在onError之前调用onSuccess,则测试将通过(。