我试图在茉莉花测试中访问控制器的属性,但我在设置测试时遇到了问题。
这是控制器:
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问题并没有帮助我。
谢谢!
答案 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);
});
});
});