繁体   English   中英

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

[英]Why is this async Jasmine test failing?

为什么此测试失败,并说从未调用过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 ,则测试将通过)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM