尝试运行jasmine测试时,控制器未定义

时间:2014-05-30 10:52:25

标签: angularjs unit-testing jasmine angularjs-e2e karma-jasmine

我正准备为我的angularjs-app编写测试。然而,当我试图运行非常简单的测试时,我得到以下错误。

Error: [ng:areq] Argument 'MyPageController' is not a function, got undefined

我将提供用于设置控制器,配置等的代码。

路线

var myPageApp = angular.module('myPageApp', ['ngRoute', 'ngAnimate', 'ngSanitize', 'app.controller', 'app.service', 'app.filter', 'app.config'])
.config(['$routeProvider', function ($routeProvider) {
   $routeProvider
    .when('/', {
        templateUrl: 'App_AngularJs/partials/myPage/myPage.htm',
        controller: 'MyPageController',
        reloadOnSearch: false,
    });
}]);

控制器

var myPageApp = angular.module('app.controller', ['oci.treeview', 'ui.bootstrap'])
.controller('MyPageController', ['$scope', '$routeParams', '$location', '$timeout', '$filter', '$modal', 'myPageService',
    function ($scope, $routeParams, $location, $timeout, $filter, $modal, myPageService) {
        init();

        function init() {
            $scope.page = { value: $routeParams.page || 1 };
        }
}]);

Simpel测试

'use strict';

describe('Testing MyPageController', function(){

   var scope;

//mock Application to allow us to inject our own dependencies
beforeEach(angular.mock.module('myPageApp'));

//mock the controller for the same reason and include $rootScope and $controller
beforeEach(angular.mock.inject(function($rootScope, $controller){
    //create an empty scope
    scope = $rootScope.$new();
    //declare the controller and inject our empty scope
    $controller('MyPageController', { $scope: scope });
}));

// tests start here
it('should map routes to controllers', function () {
    module('myPageApp');

      inject(function ($route) {

          expect($route.routes['/'].controller).toBe('MyPageController');
          expect($route.routes['/'].templateUrl).
            toEqual('App_AngularJs/partials/myPage/myPage.htm');
      });
   });

   it('should have variable assigned = "1"', function(){
       expect(scope.page.value).toBe(1);
   });
});

我最疯狂和最好的猜测是我需要模拟app.controller但是如何?一切都始于myPageApp,其中包含对服务,控制器等的引用。

1 个答案:

答案 0 :(得分:0)

我认为您的问题是路由和控制器正在尝试加载不同的模块,即#34; myPageApp"和" app.controller"在您使用beforeEach进行测试时,您正试图加载“myPageApp”#39;与路由器关联但不与控制器关联的模块。

所以在我看来,你要么为路由器和控制器使用相同的模块。或者尝试在测试中加载两个模块。我仍然相信将路由器和控制器与相同模块相关联更有意义。

如下的一个小例子。在常见的js文件中提取应用程序模块(可以称之为app.js)

var myApp = angular.module(
'myApp');

现在将路由器定义为

myApp.config(function ($routeProvider) {

$routeProvider
    .when('/testUrl', {
        templateUrl: '/myApp/views/test-view',
        controller: 'TestViewController'
    })

将控制器定义为

myApp.controller('TestViewController',[your dependencies goes here])

现在在你的测试中

beforeEach(module('myApp'));

这肯定会奏效。希望它有所帮助。