Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.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
Jquery 为什么Jasmine测试失败,所有功能都必须在测试范围内?_Jquery_Html_Angularjs_Jasmine - Fatal编程技术网

Jquery 为什么Jasmine测试失败,所有功能都必须在测试范围内?

Jquery 为什么Jasmine测试失败,所有功能都必须在测试范围内?,jquery,html,angularjs,jasmine,Jquery,Html,Angularjs,Jasmine,这是一个双管齐下的问题: 第一个问题 在基于Jasmine的角度测试中,是否所有功能都必须在测试范围内?例如,如果我调用测试套件中的函数,如下所示: searchTabController.disableDateFields() 我得到以下信息: TypeError: 'undefined' is not a function 第二个问题 我试图测试组件的属性是否已设置。第一个expect通过并确定组件是否存在,但第二个expect失败-为什么 如果我注释掉前3行并运行后3行,它仍然会失败-

这是一个双管齐下的问题:

第一个问题

在基于Jasmine的角度测试中,是否所有功能都必须在测试范围内?例如,如果我调用测试套件中的函数,如下所示:

searchTabController.disableDateFields()
我得到以下信息:

TypeError: 'undefined' is not a function
第二个问题 我试图测试组件的属性是否已设置。第一个
expect
通过并确定组件是否存在,但第二个
expect
失败-为什么

如果我注释掉前3行并运行后3行,它仍然会失败-应该如何正确地测试它

 it( 'disableDateFields() should disable all date fields', function() {

    // Passes
    expect( $('#visSearchFrom') ).toBeDefined();
    var strgState = $('#visSearchFrom').attr('disabled');
    expect( strgState ).toBe( 'disabled' );

    $('#visSearchFrom').prop('disabled', true);
    var state = $('#visSearchFrom').prop('disabled'); 
    expect( state ).toBe( true );  
});
两次失败返回的错误如下:

* Expected undefined to be 'disabled' 

我正在测试的实际函数如下所示:

 function disableDateFields() {

        $('#visSearchFrom').prop('disabled', true);
        $('#visSearchTo').prop('disabled', true);
        $("input[name='chkCurrentWeek']").attr("disabled", "disabled");
    };

要回答第一个问题,请回答否。您可以在控制器内使用“this”,然后通过控制器测试访问它

angular.module('app').controller('searchTabController', function($scope){

    // Create the function as part of the controller object
    this.disableDateFields = function(){ ... };

    // expose it in the scope if you want to.
    $scope.disableDateFields  = this.disableDateFields;    

});
然后在测试中:

var searchTabController;

inject(function($rootScope, $controller){
   searchTabController= $controller('searchTabController', {
       $scope : $rootScope
   });
}

searchTabController.disableDateFields();

控制器不应包含任何DOM操作,否则在进行单元测试时会遇到困难。测试中的第一行“expect($('#visSearchFrom')).toBeDefined();”将始终为真,因为jquery将返回空数组,以防它找不到任何内容,而不是“undefined”。在您的测试页面中,#visSearchFrom可能不在html中。@runTarm我同意这主要是通过服务完成的,但该项目即将完成,我们可能没有时间进行重构。制作该函数的开发人员不知道angular是如何工作的,并在above@YairTavor它是作为div idi的参数在测试html中进行的。如果是这种情况,您应该包括更多细节,例如包含您正在查询的那些DOM元素的html模板。其他人会更容易尝试帮助你。这是唯一的两个选择吗?如果您不需要它来调用范围,那么使用它会更好吗?这一点很重要,因为它需要重构类以包含一个或另一个。如果需要,可以将函数提取到服务,将其注入控制器,然后测试服务。如果希望函数以可测试的方式位于控制器中,则必须使用“this”符号或在作用域上公开函数。
var searchTabController;

inject(function($rootScope, $controller){
   searchTabController= $controller('searchTabController', {
       $scope : $rootScope
   });
}

searchTabController.disableDateFields();