JasmineJS + AngularJS:如何模拟Spy#callFake()内部的延迟

时间:2019-01-21 23:17:36

标签: jasmine jasmine-jquery jasmine2.0

假设我有一个返回当前位置的服务功能。并且该函数具有回调以返回位置。我们可以像下面这样轻松mock函数。但是我想在callFake()调用successHandler(location)之前引入一些延迟(比如说1秒)。

有没有办法做到这一点?

xxxSpec.js

spyOn(LocationService, 'getLocation').and.callFake(function(successHandler, errorHandler) {

   //TODO: introduce some delay here

   const location = {...};
   successHandler(location); 
}

LocationService.js

function getLocation(successCallback, errorCallback) {
    let location = {...};
    successCallback(location);
}

1 个答案:

答案 0 :(得分:0)

使用setTimeout API(详细信息here)可以很容易地在Javascript中引入延迟。您尚未指定是否使用Angular等框架,因此您的代码可能与下面的代码略有不同。

您似乎没有使用Observables或Promises来更轻松地处理异步代码。 Jasmine 2确实具有“完成”回调,对此很有用。这样的事情可能会起作用:

it( "my test", function(done) {
    let successHandler = jasmine.createSpy();
    spyOn(LocationService, 'getLocation').and.callFake(function(successHandler, errorHandler) {
        setTimeout(function() {
            const location = {...};
            successHandler(location); 
        }, 1000); // wait for 1 second
    })

    // Now invoke the function under test
    functionUnderTest(/* location data */);

    // To test we have to wait until it's completed before expecting...
    setTimeout(function(){
        // check what you want to check in the test ...
        expect(successHandler).toHaveBeenCalled();
        // Let Jasmine know the test is done.
        done();
    }, 1500); // wait for longer than one second to test results
});

但是,我不清楚为什么增加超时对您的测试很有价值。 :)

我希望这会有所帮助。