我是角色和业力的新手。
在角度我有一个像下面这样的控制器
angular.module('login').controller('LoginCtrl', function ($scope, $location) {
var vm = this;
$scope.text = 'Hello World!';
vm.text = 'hi';
});
我写下面的业力测试案例
describe('LoginCtrl', function() {
beforeEach(module('login'));
beforeEach(module('auth2AdminUI'));
var scope,ctrl,vm;
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('LoginCtrl', {$scope: scope});
vm = this.ctrl;
}));
it('Checck scope text', function () {
expect(scope.text).toBe('Hello World!');
});
it('check vm text',function(){
expect(vm.text).toBe('hi');
})
Checck范围文本测试用例已通过,但Checck vmtext失败。我不知道为什么。我的代码有问题,我想我正在使用这个来访问控制器,这可能会有问题。
错误:
LoginCtrl
x check vm variable
PhantomJS 1.9.8 (Windows 8 0.0.0)
Chrome 46.0.2490 (Windows 8.1 0.0.0)
TypeError: Cannot read property 'text' of undefined
告诉我如何在控制器中访问uning this关键字的变量和功能。
答案 0 :(得分:2)
这里vm只是你的控制器,所以你可以使用Controller来测试变量和函数。
describe('Login Ctrl Description', function () {
var LoginCtrl;
beforeEach(inject(function ($rootScope) {
scope = $rootScope.$new();
// Create Login controller
LoginCtrl = $controller('LoginCtrl', {
$scope: scope
});
}));
it('check vm text', function () {
expect(LoginCtrl.text).toBe('hi');
})
});
答案 1 :(得分:0)
您正尝试从控制器外部使用this
访问控制器上下文。这是不可能的。 this
是一种JavaScript构造,允许访问函数称为的上下文。由于控制器实际上用作构造函数this
是指使用new
关键字通过angular构造的对象(换句话说,控制器称为作为构造函数) 。因此,this
引用从控制器构建的对象。这意味着您添加到this
的所有内容都是新对象的属性。因此,添加到this
的所有内容都已公开!
这就是我要这样做的方式:
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('LoginCtrl', {$scope: scope});
// vm = this.ctrl; //<--- This line is unnecessary, delete it
}));
尝试将其作为测试:
it('check vm text',function(){
expect(ctrl.text).toBe('hi'); // Note that you should reference the controller since $controller constructs a new controller object and you store it in "ctrl"
})