Подтвердить что ты не робот

Включить зависимости в файле теста 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?

4b9b3361

Ответ 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".