带位置服务的angularjs注射器

时间:2014-04-28 14:31:39

标签: javascript angularjs angularjs-injector

我正在使用Jasmine测试一些Angular.js代码。为此,我需要一个Angular进样器:

var injector = angular.injector(['ng', 'ngRoute', 'mainModule']);

这很好用,但是当我测试一个使用$ location的控制器时,我必须将它添加到注入器中:

var injector = angular.injector(['ng', 'ngRoute', 'location', 'mainModule']);

现在这会引发错误:

Error: Error: [$injector:modulerr] Failed to instantiate module location due to:
Error: [$injector:nomod] Module 'location' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

如何在那里加入$ location服务?谢谢。

--------------编辑-----------------

由于答案不多,我想我会补充一些细节。

这是我试图测试的控制器(或者它的定义,我不会粘贴所有代码):

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

app.controller('appController', ['$window', '$scope', '$location', '$wsService', '$userService', '$labelService', function ($window, $scope, $location, $wsService, $userService, $labelService) {
    //body of the controller
}]);

您已经在原始帖子中看到了我在单元测试中创建注入器的方法,以下是我如何使用注入器创建控制器:

var scope;
var controller;
var getController = function() {
    injector.invoke( ['$rootScope', '$controller', function ($rootScope, $controller) {
        scope      = $rootScope.$new();
        controller = $controller('appController', {$scope: scope});
    }]);
};

希望这有助于产生一些潜在的答案。感谢

1 个答案:

答案 0 :(得分:2)

回答我自己的问题。以下是测试以下控制器的方法:

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

app.controller('appController', ['$window', '$scope', '$location', '$userService', function ($window, $scope, $location, $userService) {
    //body of the controller
}]);

1 在单元测试中创建注入器:

var injector = angular.injector(['ng', 'ngRoute', 'mainModule']);

2 调用所需的服务:

injector.invoke( ['$userService',  function ($userService) {
    service     = $userService;
}]);

3 模拟位置服务:

var mockLocation = {
    path : ""
};

我只需要path作为我正在测试的控制器,因此我没有模仿任何其他东西,而是模拟你需要的任何其他东西。

4 调用控制器:

var scope;
var controller;
var getController = function() {
    injector.invoke( ['$rootScope', '$controller', function ($rootScope, $controller) {
        scope      = $rootScope.$new();
        controller = $controller('appController', {$scope: scope, $location: mockLocation});
    }]);
};

现在控制器可用于单元测试 这确实摆脱了“未知提供者”以及与位置服务相关的其他错误 感谢作者,This博客文章为我提供了答案。