无法单元测试角度控制器与服务模拟
问题描述:
我开始与AngularJs和我正在面临一个问题,当试图单元测试一个服务作为依赖项的控制器。该应用程序按预期工作,但不是单元测试。我与茉莉花测试以下错误:无法单元测试角度控制器与服务模拟
Error: [$injector:modulerr] Failed to instantiate module ghhweb.register due to: Error: [$injector:unpr] Unknown provider: $stateProvider
我的模块代码:
var registerModule = angular.module('ghhweb.register',[]);
registerModule.config(function($stateProvider, $locationProvider){
var registerState = {
name: 'register',
url: '/register',
controller: 'RegisterController',
templateUrl: 'modules/register/views/register.html'
};
$stateProvider.state(registerState);
});
我的控制器代码:
var registerController = angular.module('ghhweb.register.controller',[]);
registerController.controller('RegisterController', ['$scope',
'userRestService', function($scope, userRestService){
$scope.callCheckExistingMail = function(){
$scope.userEmail = userRestService.checkExistingMail($scope.userEmail);
};
}]);
我的规格代码:
describe('controller register module unit tests', function(){
describe('check user service implementation', function(){
beforeEach(module('ghhweb.register'));
it('should call checkExistinMail in userRestService', inject(function(
$rootScope, $controller){
// make a userRestService
var userRestService = {
checkExistingMail: function() {}
};
spyOn(userRestService, "checkExistingMail");
controller('RegisterController', {$scope: scope,
userRestService: userRestService });
expect(userRestService.checkExistingMail).toHaveBeenCalled();
}));
});
});
我已经试过很多的教程和检查的几个职位像这样:
- angular-unit-test-controllers-mocking-service-inside-controller
- injecting-a-mock-into-an-angularjs-service
我想我有一个配置问题的地方,但我无法解决它。
有没有人有想法?
答
我怀疑我以前的测试代码不适用于我现有的库版本。我使用的是:
"devDependencies": {
"bower": "^1.8.0",
"http-server": "^0.9.0",
"jasmine-core": "^2.4.1",
"karma": "^1.3.0",
"karma-chrome-launcher": "^2.0.0",
"karma-firefox-launcher": "^1.0.0",
"karma-jasmine": "^1.0.2",
"phantomjs": "^2.1.7",
"protractor": "^4.0.9"
经过进一步调查我改写了测试代码如下:
describe('controller register module unit tests implementation', function(){
var $controller;
var $scope;
var userRestService;
beforeEach(module('ghhweb.register.controller', function($provide){
userRestService = jasmine.createSpyObj('userRestService'
, ['checkExistingMail']);
userRestService.checkExistingMail.and.returnValue(0);
$provide.value('userRestService', userRestService);
}));
beforeEach(inject(function(_$controller_, $rootScope,_userRestService_){
$scope = $rootScope.$new();
userRestService = _userRestService_;
$controller = _$controller_('RegisterController', {
$scope: $scope,
userRestService: userRestService
});
$scope.callCheckExistingMail();
}));
it('should call userRestService', function(){
expect(userRestService.checkExistingMail).toHaveBeenCalled();
});
});
测试现在运行正常!