在单元测试期间监视由angular.js $ interval调用的函数

时间:2015-08-17 12:53:47

标签: angularjs unit-testing jasmine

测试$ interval调用的函数时遇到问题。

简而言之:

angular.module('services', [])
  .factory('someFactory', [function () {
    function someFunction () { console.log('someFunction called'); }
    $interval(someFunction, 100);

    return {
      someFunction: someFunction
    }
  }]);

describe('someFactory', function () {
  it('should call someFunction', function () {
    spyOn(someFactory, 'someFunction');
    $interval.flush(150);
    // someFactory.someFunction() // will pass when uncommented
    expect(someFactory.someFunction).toHaveBeenCalled(); // FAIL
  );
});

在这两种情况下,' someFunction称为'登录到控制台,所以flush调用该函数,但是当$ interval应用该函数时,间谍无法看到它。

Angular 1.2和Jasmine 1.3

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在监视的

someFunction 是对象文字中返回的那个。 $ interval调用的 someFunction 是工厂内声明的私有函数。您可以执行$interval(this.someFunction, 100);之类的操作以使其正常运行。

另外,在更新plunker的示例中,您似乎正在测试同一类的方法之间的交互(模拟someFunction)。 IMO因为单元测试的范围是一个类,所以你不应该模拟那个类的功能。您应该测试方法调用的输出或副作用,例如在上面的示例中,测试console.log在100ms后调用,而不是调用$ interval。