Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jasmine测试带有嵌套超时的javascript函数_Javascript_Angularjs_Jasmine_Onblur - Fatal编程技术网

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

如何使用jasmine测试带有嵌套超时的javascript函数,javascript,angularjs,jasmine,onblur,Javascript,Angularjs,Jasmine,Onblur,我有下面的功能,可以简单地清除模糊的输入。我使用的是角度材质,我正在创建一个指令,当我希望这样做时,可以添加它 function clearTextOnBlurLink(scope, element, attrs, controller) { $timeout(function() { var input = element.find('input'); input.on('blur', fun

我有下面的功能,可以简单地清除模糊的输入。我使用的是角度材质,我正在创建一个指令,当我希望这样做时,可以添加它

   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('');


    });
beforeach(注入(函数($rootScope,$compile,$timeout){
$scope=\$rootScope\$new();
$compile=\$compile;
$timeout=$timeout;
$scope.searchText='blah';
元素=角度。元素('\
\
');
元素=$compile(元素)($scope);
$scope.$apply();
$timeout.flush();
}));
它('在模糊时清除文本',函数(){
变量输入=元素。查找('input')。等式(0);
expect(input.val()).toBe('blah');
expect($scope.searchText).toBe('blah');
input1.triggerHandler('blur');
expect(input.val()).toBe(“”);
expect($scope.searchText).toBe(“”);
});
好的,我把setTimeout改成$timeout。
有没有一种不需要两次超时就可以轻松完成的方法?

第二次使用
setTimeout
有什么原因吗?为什么不再次使用
$timeout
。。。?另外,
$timeout
通常有点代码味道,所以嵌套的
$timeout
感觉有点不对劲p


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

您也可以在测试中使用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('');

您注入了$timeout,但在函数中使用的是未注入的setTimeout,因此代码变为异步。您可以尝试使用onValueChange钩子模拟输入元素。或者在函数中使用$timeout而不是setTimeout。我想我没有意识到我在使用setTimeout。。愚蠢的错误。我把它改为$timeout,在模糊后刷新,它就工作了。我有第二次冲水,但由于设置超时,它不起作用。我使用两个超时有两个原因。我需要做的第一件事是确保页面加载完成,以便在现有元素上添加事件。第二个原因是,我将该指令添加到芯片内部的自动完成中。如果我没有超时,我就不能选择芯片,因为当我选择芯片时,它会清除我的选择。如果你有更优雅的解决方案,我洗耳恭听:)