Grunt-Karma-Jasmine: не могу найти модуль

Я пытаюсь настроить тесты для своего проекта Angular.js, но продолжаю получать сообщение «$injector:nomod, результат модуля недоступен! Вы либо ошиблись…». Я уверен, что включаю модуль «результат» в массив «файлы» внутри «karma.config.js», в основном это выглядит так:

files: [
          '../javascripts/jquery-2.1.4.min.js',
          '../jquery-ui/jquery-ui.min.js',
          '../D3/d3.js',
          'libs/angular.min.js',
          'libs/angular-route.min.js',
          'libs/angular-animate.min.js',
          'libs/selectize.js',
          'libs/angular-selectize.js',
          'libs/angular-mocks.js',

          'simulator.js',

          '*.js',
          'services/**/*.js',
          'qa/tests-*.js'
],

...

Сначала я подумал, что порядок основного модуля: «симулятор» (определенный внутри файла «simulator.js») неверен, поэтому я специально переместил его вверх, перед другими модулями, как рекомендует следующий поток stackoverflow:

модуль Angular недоступен в тестовом прогоне Karma Jasmine

Это не помогло. Затем я попытался убедиться, что файлы импортируются в том же порядке, что и в файле основной записи моих угловых приложений (за исключением angular-mocks.js и qa/tests-*.js), импортируя каждый отдельный файл вместо использования подстановочные знаки, но безуспешно.

Жасмин определенно входит в тестовые файлы, но натыкается на строку, где я пытаюсь импортировать модуль «результат»:

describe('simulator.chartService', function() {

var chartService;
var graphConfig;

console.log("instantiating module result");
  beforeEach(module('result'));
console.log("finished instantiating");

beforeEach(inject(function($injector) {
  graphConfig = $injector.get('graphConfig');
  chartService = $injector.get('chartService');

}));

it('should be created', function() {
  expect(chartService.calcColors(10)).not.toBeNull();
});

});

Итак, я вижу, что ошибка возникает между двумя операторами console.log().

Я подозреваю, что еще что-то может быть не так с порядком моих файлов внутри массива "файлы" в "karma.config.js". У меня есть основной модуль «симулятор», который зависит от других модулей:

angular.module('simulator', ['ngRoute','ngAnimate','selectize','newexp2','newexp','login','edit','exps', 'result','templates','commons'])

Модули 'newexp2', 'newexp', 'логин', 'редактирование', 'exps', 'result', 'templates' зависят от модуля 'commons'.

Как правильно импортировать взаимозависимые модули внутри массива «файлы»? Достаточно ли разместить основной модуль «simulator.js» выше всех остальных, или мне также нужно разместить все остальные модули перед «commons.js»?

Еще одно мое подозрение заключается в том, что версия библиотеки angular.js, которую я скачал с официального веб-сайта angular, «angular-mocks.js», может быть несовместима с другими модулями, которые я использую. Раньше у меня была такая проблема с файлом angular-animate.js.

Пока я окружаю свой тестовый код $(function(){...}) (и все остальные мои модули окружены им), он не генерирует ошибку при импорте модуля result, поэтому я начинаю видеть два оператора console.log() без ошибки между ними, однако это выдает какую-то неизвестную ошибку, из-за которой я вообще не могу вызвать часть it, тогда как, когда я не окружаю ее $(function(){...}), тест it вызывается, но импорт модуля result завершается ошибкой.

Пока я в значительной степени застрял и не знаю, куда двигаться и что попробовать. Любое предложение будет принято с благодарностью.


person Nikita Vlasenko    schedule 28.10.2015    source источник
comment
Вы уверены, что simulator — это отсутствующий модуль? Возможно, это один из других модулей, которые вы вводите.   -  person Explosion Pills    schedule 28.10.2015
comment
нет, он не отсутствует в соответствии с ошибкой, которую он мне дает. Отсутствует модуль «результат», от которого зависит основной модуль «симулятор».   -  person Nikita Vlasenko    schedule 28.10.2015
comment
Я запускаю grunt в терминале, он показывает ошибку ч/б двумя операторами console.log(). Я перехожу по ссылке с ошибкой, и она показывает следующее $injector:modulerr: Failed to instantiate module result due to: [$injector:nomod] http://errors.angularjs.org/1.4.7/$injector/nomod?p0=result I/<@http://localhost:9876//home/nikita/workspace/simulator/public/angular/libs/angular.min.js?b6b56d0e096efc26e09d6cf2cd37aac6123cc346:6:416 de/workFn@http://localhost:9876/base/libs/angular-mocks.js?e... Переход по ссылке далее дает мне $injector:nomod: Module 'result' is not available! ...   -  person Nikita Vlasenko    schedule 28.10.2015
comment
Где вы определяете модуль result?   -  person Explosion Pills    schedule 28.10.2015
comment
в файле result.js, который находится в той же папке, что и файл karma.config.js, поэтому я могу либо импортировать его вручную, так же, как я делаю с simulator.js, либо указать его с помощью подстановочного знака: *.js, что я и делаю сразу после simulator.js файл импортируется.   -  person Nikita Vlasenko    schedule 28.10.2015
comment
ни один импорт (ручной, подстановочный знак) не работает, конечно. Внутри result.js у меня есть: $(function(){ angular.module('result', ['commons']) ...   -  person Nikita Vlasenko    schedule 28.10.2015
comment
Я также должен отметить, что само приложение работает просто отлично, поэтому в основном файле, simulator.js, я могу импортировать все модули angular.module('simulator', ['ngRoute','ngAnimate','selectize','newexp2','newexp','login','edit', 'exps', 'result','templates','commons'])   -  person Nikita Vlasenko    schedule 28.10.2015
comment
Еще одна вещь, которую я только что заметил, заключается в том, что если я оборачиваю свой тестовый файл в $(function(){...});, то каким-то образом отображаются два оператора console.log(), и ошибка модуля не генерируется: он перестает двигаться дальше, даже не вызывая часть it. В консоли я начинаю видеть, что он просто терпит неудачу без каких-либо объяснений. Без переноса он вызывает часть it и все промежуточные части console.log().   -  person Nikita Vlasenko    schedule 28.10.2015


Ответы (1)


Хорошо, я понял это. Проблема заключалась в том, что ВЕСЬ мой угловой код был заключен внутри $(function(){...}). Решение состоит в том, чтобы удалить все $function(){...}), затем изменить порядок импорта javascript в файле .html основной записи, и тогда все тестирование начнет работать хорошо. Вопрос может быть лучше пометить как дубликат с помощью:

проблема с Angular document.ready()

person Nikita Vlasenko    schedule 03.11.2015