我正在尝试为控制器编写一些测试,但是此文档上的所有文档/教程/ etc均使用$scope上的函数和变量进行了演示.如果您想测试不在$scope上的东西怎么办?
例如:
app.controller('fakeCtrl', function($scope) {
var foo = 'bar';
function fooBar() {
console.log('foo bar');
}
});
有什么方法可以对foo或fooBar()进行单元测试?
这是行不通的:
describe("fake controller", function(){
beforeEach(module('app'));
var $controller;
beforeEach(inject(function(_$controller_, $rootScope){
$controller = _$controller_;
$scope = $rootScope.$new();
}));
describe('foo property', function() {
it('is bar', function() {
var controller = $controller('fakeCtrl', { $scope: $scope });
expect(controller.foo).toEqual('bar');
});
});
...
解决方法:
你不能.在控制器构造函数的范围之外,无法访问变量foo和函数fooBar.但是,您可以执行以下操作:
app.controller('fakeCtrl', function($scope) {
this.foo = 'bar';
this.fooBar() {
console.log('foo bar');
}
});
然后:
(...)
describe('foo property', function() {
it('is bar', function() {
var controller = $controller('fakeCtrl', { $scope: $scope });
expect(controller.foo).toEqual('bar');
});
});
在测试中,您将foo描述为属性,但是在控制器中,foo只是变量而不是属性.
编辑:检查https://docs.angularjs.org/api/ng/directive/ngController和控制器作为语法.