使用Jasmine测试带有超时的JS回调
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jasmine测试带有超时的JS回调相关的知识,希望对你有一定的参考价值。
我需要使用Jasmine在Angular中测试一些代码,但问题是由于$ timeout调用我不能这样做。所以代码看起来像这样:
$scope.add = function() {
SomeService.add(id, function() {
$timeout(function() {
$scope.showSuccessMessage();
}, 1000)
}, function() {})
};
所以测试代码是:
describe('method add', function() {
it('should add', function() {
spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) {
spyOn(scope, 'showSuccessMessage');
successCallback();
expect(scope.showSuccessMessage).toHaveBeenCalled();
});
scope.add();
expect(SomeService.add).toHaveBeenCalled();
});
});
问题是因为超时调用我无法检查是否已调用showSuccessMessage()。我知道Jasmine使用超时的能力,但在这种情况下,由于在回调中调用它,我找不到工作方式。所以这就是我需要帮助的原因。谢谢。
答案
你可以在调用原始函数后使用flush
来$timeout.flush()
你的超时。这应该允许您访问successCallback
。
另外,我会把spy
的expect
和showSuccessMessage
放在其他spy
之外
describe('method add', function() {
it('should add', function() {
spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) {
successCallback();
});
spyOn(scope, 'showSuccessMessage');
scope.add();
$timeout.flush();
expect(SomeService.add).toHaveBeenCalled();
expect(scope.showSuccessMessage).toHaveBeenCalled();
});
});
另一答案
我不太熟悉角度的工作,我希望这有助于:
您可以将done函数用于异步代码:
it('should add', function (done) {
$scope.successCallback = function () {
// successCallback was called
done();
}
$scope.add();
});
以上是关于使用Jasmine测试带有超时的JS回调的主要内容,如果未能解决你的问题,请参考以下文章
jasmine:在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调