茉莉无法访问angularjs 1.5控制器属性

时间:2016-06-22 02:45:02

标签: angularjs jasmine tdd

我试图在茉莉花测试中访问控制器的属性,但我在设置测试时遇到了问题。

这是控制器:

  adminApp.controller('AdminClientController', [function() {
     var adminClient = this;
     adminClient.name = 'Client Name';
     adminClient.sites = [
     {
        id: "site1",
        domain: "myschool.com",
        pages: [
            {
                id: 1,
                name: "HOME"
            },
            {
                id: 2,
                name: "FORM"
            }
        ]
      }
    ]

  }]);

以下是规范:

  describe('AdminClientController', function() {
     beforeEach(module('adminClientApp'));

     var $scope, $controller;

     beforeEach(inject(function(_$controller_, _$rootScope_){
        $rootScope = _$rootScope_;
        $controller = _$controller_;

        $scope = $rootScope.$new();
     }));

     describe('site pages', function() {

     beforeEach(function() {
        //$scope = {};
        controller = $controller('AdminClientController as adminClient', { 
            $scope: $scope });
    });

    it('should create a site model with 2 pages', function() {
        expect(controller.adminClient.sites[0].pages.length).toBe(2);
    });
  });

 });

错误:

  TypeError: Cannot read property 'sites' of undefined

之前我尝试初始化$ scope(即使我没有在控制器中明确使用它)并且没有使用控制器作为语法。

  beforeEach(function() {
        $scope = {
            adminClient: {
                sites: [
                    {
                        id: "site1",
                        domain: "myschool.com",
                        pages: [
                            {
                                id: 1,
                                name: "HOME"
                            },
                            {
                                id: 2,
                                name: "FORM"
                            }
                        ]
                    }
                ]
            }
        };
        controller = $controller('AdminClientController', { 
            $scope: $scope });
    });

我刚刚开始测试,并希望尽早使用它,否则它不会在以后发生。我发现的其他SO问题并没有帮助我。

谢谢!

1 个答案:

答案 0 :(得分:1)

它不是您在测试用例中无法访问的控制器属性。它是adminClient中您无法访问的controller。那是因为它不存在。

您指定的地方

expect(controller.adminClient.sites[0].pages.length).toBe(2);

你应该指定

expect(controller.sites[0].pages.length).toBe(2);

在这种情况下,controller就是AdminClientController的参考号。在您定义AdminClientController的位置,adminClient充当AdminClientController的参考号

同样正如@ScottL所提到的,由于您并未将$ scope作为依赖项注入控制器,因此您在测试用例中也不需要它。

所以这应该是你的新测试用例:

describe('AdminClientController', function() {
    beforeEach(module('adminClientApp'));
    var $controller, controller;

    beforeEach(inject(function(_$controller_){
        $controller = _$controller_;
        controller = $controller('AdminClientController', { });
    }));

    describe('site pages', function() {
        it('should create a site model with 2 pages', function() {
            expect(controller.sites[0].pages.length).toBe(2);
        });
    });
});