测试$ 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
谢谢!
答案 0 :(得分:0)
someFunction 是对象文字中返回的那个。 $ interval调用的 someFunction 是工厂内声明的私有函数。您可以执行$interval(this.someFunction, 100);
之类的操作以使其正常运行。
另外,在更新plunker的示例中,您似乎正在测试同一类的方法之间的交互(模拟someFunction)。 IMO因为单元测试的范围是一个类,所以你不应该模拟那个类的功能。您应该测试方法调用的输出或副作用,例如在上面的示例中,测试console.log
在100ms后调用,而不是调用$ interval。