Как создать угловой контроллер для тестирования с интерном
Я пытаюсь проверить угловой контроллер с помощью интерна тестирования среды. Я успешно проверил угловые услуги. Тем не менее при попытке загрузить контроллер с помощью $controller('myController', { '$scope': scope });
Я получаю сообщение об ошибке неизвестного поставщика.
У меня есть варианты передать строку, которая является именем зарегистрированного контроллера, или передать контроллер как функцию. Чтобы избежать загрязнения глобальной области, я решил зарегистрировать контроллер, используя синтаксис module(). Controller(). Что означает, что мне нужно передать имя в виде строки.
Контроллер определяется следующим образом:
app.controller('UnitsCtrl', [
'$scope',
'$http',
'auth',
function ($scope, $http, auth) {
// do stuff
}
]);
В тесте интерна я загружаю модули так:
define([
'intern!object',
'intern/chai!assert',
'intern/order!bower_components/angular/angular',
'intern/order!bower_components/angular-mocks/angular-mocks',
'intern/order!public/src/javascripts/app.controllers' ],
function (registerSuite, assert, ng, ngMock, appControllers) {
Затем, используя запись объектного тестирования, я регистрирую нужную мне переменную на протяжении всего теста:
registerSuite(function () {
var $injector, unit, scope, $rootScope,
$controller, UnitsCtrl, $window;
return {
name: 'Units controller',
И в функции настройки я создаю экземпляр инжектора, передавая модули, необходимые для тестирования. И создать экземпляр поставщика контроллера и корневую область.
setup: function() {
$injector = angular.injector(['ng', app.controllers' ]);
$rootScope = $injector.get('$rootScope');
$controller = $injector.get('$controller');
Наконец, перед каждым тестом я пытаюсь создать экземпляр тестируемого контроллера:
scope = $rootScope.$new();
UnitsCtrl = $controller('UnitsCtrl', { '$scope': scope });
Когда я запускаю тест, это вызывает следующую жалобу:
! [$injector:unpr] Unknown provider: authProvider <- auth <- UnitsCtrl
Что меня смущает, так это почему он ищет контроллер UnitsCtrl в службе аутентификации?!
1 ответ
Как выясняется, жалоба неизвестного поставщика была не связана с контроллером, который я пытался создать, а с одной из его зависимостей. Поскольку я не загружал модуль служб, не удалось найти зависимость (она не была зарегистрирована).
Исправление состояло в том, чтобы смоделировать зависимость и передать ее контроллеру как часть объекта, который является вторым параметром.
auth = { //stuff };
UnitsCtrl = $controller('UnitsCtrl', { '$scope': scope, 'auth': auth});