Включить зависимости в файле теста Karma для приложения Angular?
Я пытаюсь начать с тестов Karma, добавив их в существующее приложение Angular.
Это мой основной файл определения приложения:
angular
.module('myApp', [
'ngRoute',
'moduleAdherence'
]);
Это мой файл контроллера:
angular
.module('moduleAdherence', [])
.controller('AdherenceCtrl', ['$scope', function ($scope) {
$scope.awesomeThings = [1,2,3,4];
}]);
Это мой первый удар в файле:
describe('Controller: AdherenceCtrl', function () {
beforeEach(module('myApp'));
var MainCtrl,
scope;
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
MainCtrl = $controller('AdherenceCtrl', {
$scope: scope
});
}));
it('should attach a list of awesomeThings to the scope', function () {
expect(scope.awesomeThings.length).toBe(4);
});
});
Когда я пытаюсь запустить это с помощью grunt test
, он терпит неудачу со следующей ошибкой:
Uncaught Error: [$injector:nomod] Module 'd3' 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.
http://errors.angularjs.org/1.2.0/$injector/nomod?p0=d3
at /Users/me/Dropbox/projects/myapp/app/bower_components/angular/angular.js:1498
Я не понимаю этого, потому что этот контроллер не использует D3. Я использую D3 в другом месте приложения, в директиве, но я не регистрирую его с помощью модуля (я использую внешний файл D3).
Почему Карма замечает D3? Разве он не может проверить этот контроллер без D3?
Ответы
Ответ 1
В файле конфигурации кармы (karma.conf.js) вам необходимо определить все библиотеки.
и др.
// list of files / patterns to load in the browser
files: [
'app/lib/angular/angular.js',
'app/lib/angular-route/angular-route.js',
'test/lib/angular-mocks.js',
'app/app.js',
'app/controllers/*.js',
'app/services/*.js',
'app/*',
'test/spec/**/*.js'
],
Ответ 2
Была аналогичная проблема, и мое решение (вдохновленное каким-то комментарием @danba) заключалось в загрузке скриптов в files
в точный в том же порядке, что и в index.html.
В моем случае шаблоны с чередованием, подобные app/scripts/**/*.js
, вызывают проблемы с кармой, которая постоянно бросала ошибки.
Возможно, это не самое элегантное решение для копирования всех определений скриптов, но работало в конце, чтобы мой тест мог наконец вернуться. Надеюсь, что это поможет.
РЕДАКТИРОВАТЬ: Редактирование этого, потому что сегодня я, вероятно, (и, надеюсь), понял, что здесь происходит не так. Таким образом, кажется, что Карма не любит шаблоны глобусов, когда один и тот же модуль определен в одном файле и используется во многих разных файлах. Скажем, что ваша структура папок такова:
![risky folder structure]()
Предположим, что в AuthService.js
у вас есть определение вашего модуля для всех ваших служб в этой папке, так что этот файл начинается с:
angular.module('myApp.services', [
'myApp.urls',
'ngCookies'
])
Затем во всех других файлах вы просто присоединяете другие сервисы к тому же самому модулю. На картинке tokenService.js
начнется с:
angular.module('myApp.services');
Если все будет так, все будет работать. Но если я случайно определю модуль другим способом, поэтому определение модуля больше не находится в первом файле этой папки, а на другом, который Karma читает после AuthService
, тогда он выкинет ошибки и отказаться от завершения тестов.
Решение 1
Решение может заключаться в том, чтобы поместить определение модуля в его собственный файл, начиная с подчеркивания. Наконец, пусть все файлы братьев и сестер зависят от этого (-ов). Таким образом, указанная структура папок должна быть:
![safer folder structure]()
Решение 2
Другое - возможно, лучшее решение - отметить файлы, в которых модули определены с общим суффиксом/расширением, например service.module.js
, в то время как файлы, зависящие от него, могут быть названы как AuthService.js
, tokenService.js
.
Конфигурация Karma в этом месте станет чем-то вроде:
// list of files / patterns to load in the browser
files: [
'app/lib/angular/angular.js',
'test/lib/angular-mocks.js',
'app/app.js',
'app/**/*.module.js', // <-- first the module definitions...
'app/**/*.js', // <-- ..then all the other files
'test/spec/**/*.js'
],
Таким образом, карма загружает сначала определения модулей, а затем файлы, которые зависят от них.
Ответ 3
У меня также была такая же проблема, в моем случае проблема возникла из-за того, что в модуле было несколько файлов, что является плохой практикой, поскольку мы можем указать на не инициализированный модуль. Решил это, включив только один файл на модуль.
Ответ 4
Всегда загружайте не ограниченную версию angular в карму.
он будет отображать ошибки и поможет вам лучше узнать, что изменить.
В вашем случае это порядок файлов, загружаемых кармой.
Ответ 5
Проверьте свой index.html, что вы не добавили что-либо с помощью тега script, например.
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5angular-resource.js"
Весь ваш файл Javascript должен находиться в вашем файле karma.config.js
Ответ 6
Вот простое решение, которое сработало для меня на основе выше решения № 1 от @Nobita и комментария @danba.
В файле karma.conf.js явно загрузите файл предварительной настройки над шаблоном, который тянет остальные:
files: [
...
'app/module.js',
'app/*.js'
]
Карма, похоже, не помнит, что шаблон также соответствует "module.js".