簡體   English   中英

無法對模擬了服務的Angular控制器進行單元測試

[英]Unable to Unit Test an Angular Controller with service mocked

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

    });

});

我嘗試了很多教程,並檢查了幾篇類似的文章:

我想我某處有配置問題,但無法解決。

有人有主意嗎?

我懷疑以前的測試代碼不適用於現有的庫版本。 我正在使用:

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

現在測試可以正常運行!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM