【问题标题】:Unable to Unit Test an Angular Controller with service mocked无法对模拟服务的 Angular 控制器进行单元测试
【发布时间】:2016-11-24 14:37:40
【问题描述】:

我从 AngularJs 开始,在尝试对具有作为依赖项的服务的控制器进行单元测试时遇到问题。该应用程序按预期工作,但不是单元测试。 Jasmine 测试出现以下错误:

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();
        }));

    });

});

我尝试了很多教程并查看了一些类似这样的帖子:

我想我在某个地方遇到了配置问题,但我无法解决。

有人有想法吗?

【问题讨论】:

    标签: angularjs unit-testing angular-ui-router


    【解决方案1】:

    我怀疑我之前的测试代码不适用于我现有的库版本。我正在使用:

    "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();
        });
    });
    

    测试现在可以正常运行了!

    【讨论】:

      猜你喜欢
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2014-10-11
      • 2015-11-29
      • 1970-01-01
      • 2014-11-22
      • 2023-03-12
      相关资源
      最近更新 更多