Angularjs инжектор с обслуживанием местоположения

Я тестирую код Angular.js с помощью Jasmine. Для этого мне нужен угловой инжектор:

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 ответ

Решение

Чтобы ответить на мой собственный вопрос. Вот как можно проверить следующий контроллер:

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});
    }]);
};

Теперь контроллер можно использовать в модульных тестах.
Это действительно избавило от "неизвестного поставщика" и других ошибок, связанных со службой определения местоположения.
Этот пост в блоге помог мне с ответом, спасибо автору.

Другие вопросы по тегам