如何在业力测试案例中访问控制器功能?

时间:2015-11-02 09:16:55

标签: html angularjs karma-runner

我是角色和业力的新手。

在角度我有一个像下面这样的控制器

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关键字的变量和功能。

2 个答案:

答案 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"
})