假设我有一个返回当前位置的服务功能。并且该函数具有回调以返回位置。我们可以像下面这样轻松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);
}
答案 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
});
但是,我不清楚为什么增加超时对您的测试很有价值。 :)
我希望这会有所帮助。