如何使用jasmine测试嵌套超时的javascript函数

时间:2017-05-02 18:09:44

标签: javascript angularjs jasmine onblur

我有以下功能,只需清除模糊输入。我正在使用角度材料,我正在创建一个指令,以便在我希望发生这种情况时添加。

   function clearTextOnBlurLink(scope, element, attrs, controller) {   
            $timeout(function() {
                var input = element.find('input'); 
                input.on('blur', function(e){
                    setTimeout(function(){
                        input.val('');              
                        input.triggerHandler('input'); 
                    }, 100);                
                });
            },0);
        }

我想测试它,但我无法让它工作。

这是我的测试:

    beforeEach(inject(function(_$rootScope_, _$compile_, _$timeout_) {

                $scope = _$rootScope_.$new();
                $compile = _$compile_;
                $timeout = _$timeout_;        
                $scope.searchText = 'blah';

                element = angular.element('\
                    <div mx-clear-on-blur> <input ng-model="searchText1"> </div>\
                ');

               element = $compile(element)($scope);
               $scope.$apply();
               $timeout.flush();       
      }));
 it('clears text on blur', function() {
        var input = element.find('input').eq(0);

        expect(input.val()).toBe('blah');
        expect($scope.searchText).toBe('blah');

        input1.triggerHandler('blur');

        expect(input.val()).toBe('');
        expect($scope.searchText).toBe('');


    });

好的,所以我让它将setTimeout更改为$ timeout。 没有2次超时,是否有一种不那么笨重的方式呢?

2 个答案:

答案 0 :(得分:0)

你有没有理由第二次使用setTimeout?为什么不再使用$timeout ......?另外$timeout通常有点代码味道,所以嵌套$timeouts感觉有点不对。 :P

无论如何,我认为你的测试通过了你,在模糊后你的测试中需要$timeout.flush()

答案 1 :(得分:0)

您也可以在测试中使用setTimeout:

input1.triggerHandler('blur');
setTimeout(function() {
    expect(input.val()).toBe('');
    expect($scope.searchText).toBe('');
}, 100);

Jasmine应该还有一个waitsFor方法:

input1.triggerHandler('blur');
waitsFor(function() { 
    return false; 
}, 100);
expect(input.val()).toBe('');
expect($scope.searchText).toBe('');