2014-03-06 32 views
0

我有一个按以下方式定义的控制器,它的工作原理非常完美。但是,当我尝试测试该控制器它说,“(控制器名称)”不是一个函数,得到了不确定的”。如何测试这种方法定义控制器。如何测试在angularjs中通过module.config创建的控制器

controller.js

var mainModule = angular.module('module1'); 

function home($scope) { 
    $scope.test = "hello"; 
} 
home.$inject = ["$scope"]; 

mainModule.config(['$routeProvider', 
    function ($routeProvider) { 
     $routeProvider.when('/', { 
      templateUrl: 'partials/home.html', 
      controller: home 
     }); 
    } 
]); 

testSpec.js

describe("Test home controller", function() { 
    beforeEach(module('module1')); 
    it("test the controller ", inject(function ($rootScope, $controller) { 
     var ctrl = $controller("home", { 
      $scope: $rootScope 
     }); 
     expect($rootScope.items.length).toBe(3); 
    })); 
}); 
+2

您大概可以使用['$ injector.instantiate'](http://docs.angularjs.org/api/auto/service/$injector)创建一个新的'home'控制器实例。但是,你有什么理由在全球范围内创建控制器? [官方文档](http://docs.angularjs.org/guide/controller)显然不鼓励(检查第一个注释)。 –

+0

没有它在全球范围内,我有很多模块,它像每个模块的基础。你能否详细说明或指出我如何使用$ injector.instantiate – SpreeTheGr8

+1

在你发布的代码中,'home'是在全局范围内声明的。你的代码应该已经可以工作了,因为['$ controller'](http://docs.angularjs.org/api/ng/service/$controller)服务检查全局窗口对象上的'window [constructor]'。但显然'window ['home']'是'undefined'。 –

回答

1

正如@PaoloMoretti在评论中提到的,你不应该定义在全局范围控制器(除非原型)相反definie控制器作为模块的一部分:

var mainModule = angular.module('module1'); 

mainModule.controller('home', function($scope) { 

    $scope.test = "hello"; 
}); 

然后,当你使用这条线测试:

beforeEach(module('module1')); 

控制器将可用于测试。

相关问题