我想对Angular.js $timeout
进行单元测试,以检查是否已使用正确的持续时间/延迟值调用它。
断言看起来像这样:
expect($timeout).toHaveBeenCalledWith(n);
我的Angular代码大致如下所示:
$timeout(function() {
// do something
}, attrs.timeout || 30000);
我想确保在没有覆盖(attrs.timeout
)的情况下使用30000
调用它,并使用覆盖调用覆盖它。
我尝试过这样的装饰:
// from: http://stackoverflow.com/a/21536245/633056
beforeEach(module(function($provide) {
$provide.decorator('$timeout', function($delegate) {
return jasmine.createSpy($delegate);
});
}));
还有其他一些方法,但我似乎无法让它发挥作用。
我使用的是Angular 1.3.20,Jasmine 2.3.4
感激地收到任何建议。
答案 0 :(得分:4)
您可以尝试为超时创建模拟并为间谍设置期望。为了检查第一个参数,您可以使用匹配器jasmine.any(Function)
和第二个参数以及预期的延迟。
示例:
describe('Ctrl', function() {
beforeEach(module('test-app'));
var ctrl, timeout;
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
//Create Spy
timeout = jasmine.createSpy('$timeout');
ctrl = $controller('loadingCtr', {
'$timeout': timeout
});
$rootScope.$digest();
}));
//Your expectations
it('should call timeout with passed in delay', function() {
ctrl.callTimeout(1000);
expect(timeout).toHaveBeenCalledWith(jasmine.any(Function), 1000);
});
it('should call timeout with default delay', function() {
ctrl.callTimeout();
expect(timeout).toHaveBeenCalledWith(jasmine.any(Function), 30000);
});
});
<强> Demo 强>
如果是指令,只需用你的间谍覆盖timeout
。
var dir,
timeout = jasmine.createSpy('$timeout'), scope;
beforeEach(module('test-app', function ($provide) {
$provide.value('$timeout', timeout);
}));
beforeEach(inject(function($rootScope, $compile) {
scope = $rootScope.$new();
$compile('<test-timeout timeout="6000"></test-timeout>')(scope);
scope.$apply();
}));
it('should call timeout with passed in delay', function() {
expect(timeout).toHaveBeenCalledWith(jasmine.any(Function), 6000);
});
<强> Demo 强>