Jasmine单元测试$ timeout(期望($ timeout).toHaveBeenCalledWith(n);)

时间:2015-10-30 12:46:00

标签: angularjs unit-testing timeout jasmine

我想对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

感激地收到任何建议。

1 个答案:

答案 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