我正准备为我的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,其中包含对服务,控制器等的引用。
答案 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'));
这肯定会奏效。希望它有所帮助。