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