Jasmine test to test if the controller is defined

2019-04-14 08:35发布

问题:

New to Jasmine tests for angular. I am trying to test if the controller I defined is defined or not to begin with but I am getting error saying Expected undefined to be defined. Here is my main code:

// controller logic MatchController.js
(function () {
'use strict';

angular.module('app.match')
        .controller('MatchController', MatchController);


MatchController.$inject = ['APP_CONFIG', '$authUser', '$http', '$rootScope', '$state', '$stateParams', 'SearchService', 'ConfirmMatchService', 'MusicOpsService', 'ContentOpsService', 'MatchstickService', 'MatchService', 'Restangular'];
function MatchController(APP_CONFIG, $authUser, $http, $rootScope, $state, $stateParams, searchService, confirmMatchService, musicOpsService, contentOpsService, matchstickService, matchService, Restangular) {

    var vm = this;
 .
 .
 .
   }
})();

Here is the test file

// MatchController.spec.js
(function(){
'use strict';
describe('Match Controller Tests', function(){

    var module, MatchTestController;

    beforeEach(function() {
        module = angular.module('app.match');
    });

    beforeEach(inject(function ($controller) {

        MatchTestController = $controller('MatchController', {});
    }));

    describe("Match controller to be defined", function() {

        it("should be created successfully", function () {
            expect(MatchTestController).toBeDefined();
        });
    });

});

})();

I keep getting the error:

TypeError: 'undefined' is not a function (evaluating 'angular.controller('MatchController')')
undefined
    at /Users/rgoti/match-ui/match-ui/public/src/app/match/match.controller.spec.js:16
    at invoke (/Users/rgoti/match-ui/match-ui/public/bower_components/angular/angular.js:4219)
    at workFn (/Users/rgoti/match-ui/match-ui/public/bower_components/angular-mocks/angular-mocks.js:2475)
Expected undefined to be defined.
    at /Users/rgoti/match-ui/match-ui/public/src/app/match/match.controller.spec.js:22

Not sure what I am doing wrong here.

回答1:

You should inject all the dependencies in the controller first before mocking it.

Try this:

// MatchController.spec.js
(function(){
'use strict';
describe('controller: MatchController', function(){

    var module, MatchController, APP_CONFIG, $authUser, $http, $rootScope, $state, $stateParams, SearchService, ConfirmMatchService, MusicOpsService, ContentOpsService, MatchstickService, MatchService, Restangular;

    beforeEach(function() {
        module = angular.module('app.match');
    });

    beforeEach(inject(function ($controller, _APP_CONFIG_, _$authUser_, _$http_, _$rootScope_, _$state_, _$stateParams_, _SearchService_, _ConfirmMatchService_, _MusicOpsService_, _ContentOpsService_, _MatchstickService_, _MatchService_, _Restangular_) {

        APP_CONFIG = _APP_CONFIG_;
        $authUser = _$authUser_;
        $http = _$http_;
        $rootScope = _$rootScope_;
        $state = _$state_;
        $stateParams = _$stateParams_;
        SearchService = _SearchService_;
        ConfirmMatchService = _ConfirmMatchService_;
        MusicOpsService = _MusicOpsService_;
        ContentOpsService = _ContentOpsService_;
        MatchstickService = _MatchstickService_;
        MatchService = _MatchService_;
        Restangular = _Restangular_;

        MatchController = $controller('MatchController', {
            APP_CONFIG: _APP_CONFIG_,
            $authUser: _$authUser_,
            $http: _$http_,
            $rootScope: _$rootScope_,
            $state: _$state_,
            $stateParams: _$stateParams_,
            SearchService: _SearchService_,
            ConfirmMatchService: _ConfirmMatchService_,
            MusicOpsService: _MusicOpsService_,
            ContentOpsService: _ContentOpsService_,
            MatchstickService: _MatchstickService_,
            MatchService: _MatchService_,
            Restangular: _Restangular_
        });


    }));

    describe("Match controller to be defined", function() {

        it("should be created successfully", function () {
            expect(MatchController).toBeDefined();
        });

    });

});

})();