Javascript AngularJS Jasmine,控制器中的测试功能
我试图用Jasmine测试我的AngularJS控制器函数。然而,我得到了TypeError:undefined不是一个函数 这是测试的样子:Javascript AngularJS Jasmine,控制器中的测试功能,javascript,angularjs,unit-testing,testing,jasmine,Javascript,Angularjs,Unit Testing,Testing,Jasmine,我试图用Jasmine测试我的AngularJS控制器函数。然而,我得到了TypeError:undefined不是一个函数 这是测试的样子: describe('BoardController', function() { beforeEach(module('examtesting')); var BoardController; beforeEach(inject(function($rootScope, $controller) { var
describe('BoardController', function() {
beforeEach(module('examtesting'));
var BoardController;
beforeEach(inject(function($rootScope, $controller) {
var scope = $rootScope.$new();
BoardController = $controller('BoardController', {
$scope: scope,
board: null,
BoardService: null
});
}));
it ("should toggle create_active", function() {
var category = { create_active: false }
BoardController.toggleCreateActive(category);
expect(category.create_active).toBe(true);
});
});
下面是我要测试的功能:
$scope.toggleCreateActive = function(category) {
category.create_active = !category.create_active;
}
我做错了什么?就像上一个清单中所说的,toggleCreateActive是$scope上的一个函数。不能将其引用为BoardController.toggleCreateActive。相反,让scope变量可用于测试,将声明移出beforeach并调用scope.toggleCreateActive。如上一个清单中所述,toggleCreateActive是$scope上的一个函数。不能将其引用为BoardController.toggleCreateActive。相反,使作用域变量可用于测试将声明移出beforeach并调用scope.toggleCreateActive。这应该可以:
describe('BoardController', function() {
beforeEach(module('examtesting'));
var createController, scope;
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
createController = function() {
return $controller('BoardController', {
$scope: scope,
board: null,
BoardService: null
});
};
}));
it ("should toggle create_active", function() {
var category = { create_active: false },
controller = createController();
scope.toggleCreateActive(category);
expect(category.create_active).toBe(true);
});
});
这应该起作用:
describe('BoardController', function() {
beforeEach(module('examtesting'));
var createController, scope;
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
createController = function() {
return $controller('BoardController', {
$scope: scope,
board: null,
BoardService: null
});
};
}));
it ("should toggle create_active", function() {
var category = { create_active: false },
controller = createController();
scope.toggleCreateActive(category);
expect(category.create_active).toBe(true);
});
});
当您使用$scope时,所有模型都在scope上,控制器就是控制器 用controllerAs测试控制器 在我们了解了如何测试服务之后,让我们来谈谈测试控制器
function MyController(MyService) {
this.greetUpperCase = function(name) {
return MyService.greet(name).toUpperCase();
}
}
我们希望angular的DI将控制器的一个实例注入到我们的测试中,但控制器不是作为服务的Singlton
因此,我们将:
注入$controller服务
使用它为我们实例一个控制器
var $controller;
beforeEach(module('MyModule'));
beforeEach(inject(function(_$controller_) {
$controller = _$controller_; })
);
it('test greetUpperCase()', function() {
var ctrl = $controller('MyController');
expect(ctrl.greetUpperCase('bob')).toBe('HELLO BOB');
});
使用$scope测试控制器
现在,如果您仍在使用$scope:
function MyController($scope, MyService) {
$scope.greetUpperCase = function(name) {
return MyService.greet(name).toUpperCase();
}
}
基本上,当您使用$scope时,您并不真正关心控制器本身,因为它在其作用域上执行所有操作
因此,我们需要:
注入$rootScope
创建一个新范围
将其注入新控制器
测试$scope
it('test greetUpperCase()', function() {
var myScope = $rootScope.$new();
$controller('MyController', {
$scope: myScope
});
expect(myScope .greetUpperCase('bob')).toBe('HELLO BOB');
});
当您使用$scope时,所有模型都在scope上,控制器就是控制器 用controllerAs测试控制器 在我们了解了如何测试服务之后,让我们来谈谈测试控制器
function MyController(MyService) {
this.greetUpperCase = function(name) {
return MyService.greet(name).toUpperCase();
}
}
我们希望angular的DI将控制器的一个实例注入到我们的测试中,但控制器不是作为服务的Singlton
因此,我们将:
注入$controller服务
使用它为我们实例一个控制器
var $controller;
beforeEach(module('MyModule'));
beforeEach(inject(function(_$controller_) {
$controller = _$controller_; })
);
it('test greetUpperCase()', function() {
var ctrl = $controller('MyController');
expect(ctrl.greetUpperCase('bob')).toBe('HELLO BOB');
});
使用$scope测试控制器
现在,如果您仍在使用$scope:
function MyController($scope, MyService) {
$scope.greetUpperCase = function(name) {
return MyService.greet(name).toUpperCase();
}
}
基本上,当您使用$scope时,您并不真正关心控制器本身,因为它在其作用域上执行所有操作
因此,我们需要:
注入$rootScope
创建一个新范围
将其注入新控制器
测试$scope
it('test greetUpperCase()', function() {
var myScope = $rootScope.$new();
$controller('MyController', {
$scope: myScope
});
expect(myScope .greetUpperCase('bob')).toBe('HELLO BOB');
});
对特定产品/资源的过度促销可能会被社区视为垃圾邮件。看一看,特别是最后一部分:避免公开的自我推销。你也可能对某一特定产品/资源的过度促销感兴趣。社区可能会将其视为垃圾邮件。看一看,特别是最后一部分:避免公开的自我推销。你可能也会对它感兴趣。