我正在尝试对我的代码启动单元测试。我在互联网上遵循了很多指南,但我无法开始构建我的UT。
我想测试一下代码:
"use strict";
var app = angular.module('address', []);
app.controller("AddressBookController", ["$rootScope", "$scope", "viewState",
function($rootScope, $scope, viewState)
{
// PAGE DATA
$scope.pageLimit = 7;
$scope.pages = (viewState.state.pages) ? viewState.state.pages : [];
$scope.currentPage = (viewState.state.currentPage) ? viewState.state.currentPage : 0;
/* Other Code */
}
我的工厂代码就是这个:
app.factory("viewState", [function(){
return {
state : {},
data : {}
};
}])
因此,按照一些指南编写测试代码:
describe('Address Book Controller Testing', function() {
var $scope;
var controller;
var viewStateMock;
beforeEach(function() {
module('address');
//mocking factories for test
module(function($provide){
$provide.factory('viewState', function() {
return {
prova: function() {
return {
state : {},
data : {}
};
}
};
});
});
});
beforeEach(inject(function ($rootScope, $controller, viewState) {
$scope = $rootScope.$new();
viewStateMock = viewState;
spyOn(viewStateMock, 'prova').and.callThrough();
controller = $controller('AddressBookController', {
$scope: $scope,
viewState: viewStateMock
});
}));
describe('All initialized', function (){
it('$scope should be defined', function() {
expect($scope).toBeDefined();
});
});
});
});
但是,如果我每次都启动我的测试,请给我这个错误:
TypeError: Cannot read property 'pages' of undefined
我注意到在执行代码部分时错误是抛出:
controller = $controller('AddressBookController', {
$scope: $scope,
viewState: viewStateMock
});
如果我在代码部分之前在控制台$ scope上打印,我可以找到“pageLimit”的主张。
我如何继续进行测试?
谢谢大家的回答。
答案 0 :(得分:1)
问题不在于$scope
注入,而在于提供 viewState
。
当你使用$provide.factory()
时,你实际上正在建造一个工厂(并提供它)。因此语法应与您的工厂相同:
module(function($provide) {
$provide.factory('viewState', function() {
return {
state: {},
data: {}
};
});
});
请参阅jsFiddle。