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});
}]);
};
Теперь контроллер можно использовать в модульных тестах.
Это действительно избавило от "неизвестного поставщика" и других ошибок, связанных со службой определения местоположения.
Этот пост в блоге помог мне с ответом, спасибо автору.