我的指令看起来像这样:
angular.directive('myDirective', ['$compile','$timeout', function($compile,$timeout){
console.log("myDirective compile");
return {
link: function(scope, element) {
console.log("myDirective before timeout");
$timeout(function(){
console.log("myDirective after timeout");
});
}
};
}]);
当我使用Karma-Jasmine进行单元测试时,我得到LOG
和myDirective compile
的{{1}}输出。但myDirective before timeout
如何在单元测试中运行myDirective after timeout
函数?
答案 0 :(得分:11)
您可以使用flush
服务上的$timeout
方法来清除您设置的超时。 https://docs.angularjs.org/api/ngMock/service/$timeout
请注意,这在ngMock中可用,因此您需要包含角度模拟。 (我很确定你有,但以防万一。)
请参阅下面的测试以获取示例。
describe('my directive test', function () {
var element;
var scope;
beforeEach(module('myApp'));
beforeEach(inject(function($compile, $rootScope){
element = '<my-directive></my-directive>';
scope = $rootScope.$new();
element = $compile(element)(scope);
scope.$digest();
spyOn(console, 'log').and.callThrough();
}));
it('should not log the timeout', inject(function ($timeout) {
expect(console.log).not.toHaveBeenCalledWith('myDirective after timeout');
}));
it('should log after timeout', inject(function ($timeout) {
$timeout.flush();
expect(console.log).toHaveBeenCalledWith('myDirective after timeout');
}));
});
答案 1 :(得分:3)
使用
$timeout.flush(amount)
在您的测试中,使用amount
您想要传递的时间。