AngularJS - $ timeout的单元测试

时间:2015-04-07 09:23:42

标签: angularjs unit-testing jasmine karma-jasmine

我的指令看起来像这样:

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进行单元测试时,我得到LOGmyDirective compile的{​​{1}}输出。但myDirective before timeout

没有输出

如何在单元测试中运行myDirective after timeout函数?

2 个答案:

答案 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您想要传递的时间。