【问题标题】:angularjs injector with location service具有位置服务的 angularjs 注入器
【发布时间】:2014-06-14 03:53:58
【问题描述】:

我正在使用 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});
    }]);
};

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

【问题讨论】:

  • 虽然这听起来很相似,但您链接的主题并没有回答我的问题。我正在做单元测试,所以我在控制台而不是浏览器中运行 JavaScript 文件,而不创建任何 DOM,因此我无法通过传递 DOM 元素来创建注入器。我需要一种注入位置服务的方法,或者以某种方式在我的单元测试中模拟它并将其传递给注入器。

标签: javascript angularjs angularjs-injector


【解决方案1】:

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

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 博客文章帮助我回答了问题,感谢作者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2013-04-11
    • 2011-06-26
    • 2016-12-09
    • 1970-01-01
    • 2017-02-03
    • 2013-05-28
    相关资源
    最近更新 更多