Служба тестирования в модуле возврата Angular не определена


127

Я пытаюсь запустить модульный тест службы по умолчанию в своем проекте (взято из проекта Angular Seed на GitHub), но продолжаю получать сообщение об ошибке «модуль не определен».

Я читал, что это может быть связано с порядком упомянутых файлов JavaScript , но я не могу заставить его работать, поэтому, надеюсь, один из вас может помочь.

Моя конфигурация для теста выглядит так:

basePath = '../';

files = [
'public / javascripts / lib / jquery-1.8.2.js',
'public / javascripts / lib / angular.js',
'public / javascripts / lib / angular- .js',
'public / app.js ',
' public / controllers /
.js ',
' public / directives.js ',
' public / filters.js ',
' public / services.js ',
JASMINE,
JASMINE_ADAPTER,
' public / javascripts / lib / angular-mocks. js ',
' test / unit / *. js '];

autoWatch = true;

браузеры = ['Chrome'];

junitReporter = {outputFile: 'test_out / unit.xml', набор: 'unit'};

Сервис выглядит следующим образом:

angular.module('myApp.services', []).
  value('version', '0.1');

Тест выглядит так:

'use strict';

describe('service', function() {
  beforeEach(module('myApp.services'));


  describe('version', function() {
    it('should return current version', inject(function(version) {
      expect(version).toEqual('0.1');
    }));
  });
});

И ошибка при запуске теста через testacular такая:

ReferenceError: модуль не определен


2
можешь где-нибудь поделиться своим проектом? Я мог бы помочь. Вы пытались включить уровень DEBUG для testacular, чтобы увидеть, какие файлы действительно загружаются в зависимости от вашей конфигурации? На данный момент подозрительной частью является эта скороговорка: public / javascripts / lib / angular-.js - с чем он должен соответствовать?
pkozlowski.opensource

@JohnDoe Спасибо, что сработало. Если вы добавите ответ, я отмечу его как решенный. Причина заключалась в том, что я следил за семенным проектом, который делал это таким образом и который работал. Я не знаю, потому что это была более ранняя версия.
Dofs

@Dofs Есть ли опечатки "public / javascripts / lib / angular-.js" и "public / controllers / .js"?
Райан О'Нил

@ RyanO'Neill, извини, да, это была опечатка.
Dofs

Ответы:


260

Вам не хватает файла angular-mocks.js .


8
Следует отметить , что angular.moduleи angular.mock.moduleэто не то же самое. window.moduleФункция является псевдонимом angular.mock.module. См. Этот ответ для получения дополнительной информации.
Тим Шауб

Как сказано в предыдущем комментарии, angular.module не является псевдонимом для angular.mock.module.
Филиппо Де Лука,

7
Этот ответ был бы намного полезнее, если бы он предлагал какие-либо советы о том, как предоставить указанный файл. Мне нужно было установить Bower, затем NgMocks.
isherwood

4
Ответ дает только часть решения. На самом деле это комментарий, а не объяснение. Некоторые ответы ниже гораздо более подробны.
Жером Бохманн,

1
Для новичков вам нужно добавить ссылку angular-mocksна karma.conf.jsфайл и запускать тесты через Karma, а не Jasmine. Таким образом, когда Karma запущена, она подбирает angular-mocksрасширения и включает их в среду.
Люк

41

У меня была та же проблема, и я понял, почему она не работает: на jasmine.js javascript нужно ссылаться ДО файла angular-mocks.js. Действительно, angular-mocks.js проверяет, загружен ли Jasmine, и только в этом случае добавляет функцию модуля в окно.

Вот отрывок из кода Angular Mocks:

(Отредактируйте после нескольких комментариев о «взломе», которые у меня были ниже: это всего лишь отрывок кода, это не то, что вам нужно писать самостоятельно, это уже есть!)

window.jasmine && (function(window) {

[...]

  window.module = angular.mock.module = function() {
    var moduleFns = Array.prototype.slice.call(arguments, 0);
    return isSpecRunning() ? workFn() : workFn;
    /////////////////////
    [...]
  };

В двух словах: просто укажите свой jasmine.js перед angular-mocks.js и вперед.


Эту проблему также можно решить, убедившись, что файлы jasmine javascript загружаются до angular-mocks. Более чистое решение, чем внесение хакерских изменений, чтобы заставить вещи работать.
foomip

@foomip Кто предлагал внести изменения?
Стивен

По сути, вы вставили взлом в свое приложение, чтобы убедиться, что все загружается правильно - и я не имел в виду взломать плохо (нет ничего плохого в том, как вы написали этот фрагмент кода), но что происходит, когда обновить до жасмина или что-то еще заставляет этот фрагмент вашего фрагмента ломаться или больше не работать должным образом? Это могло или не могло произойти, но теперь это недостаток в вашем коде, которого можно было бы избежать, вам не кажется?
foomip

@foomip: Я не уверен, что вы имеете в виду, но если речь идет о моем приведенном выше коде, это не я написал, я просто цитирую его, чтобы объяснить проблему. Код является частью angular-mocks. Исправление - это просто ссылка на один файл перед другим.
Antoine Jaussoin

36

window.moduleФункция приходит в угловом-mocks.js и является сокращением для angular.mock.module. Как упоминалось в документации , moduleфункция работает только с Jasmine.

Используя Testacular , загрузится следующий пример файла конфигурации angular-mocks.js.

/** example testacular.conf.js */

basePath = '../';
files = [
  JASMINE,
  JASMINE_ADAPTER,
  'path/to/angular.js',
  'path/to/angular-mocks.js',   // for angular.mock.module and inject.
  'src/js/**/*.js',             // application sources
  'test/unit/**/*.spec.js'      // specs
];
autoWatch = true;
browsers = ['Chrome'];

И, как предлагается в другом месте, вы можете запустить Testacular с ведением журнала отладки, чтобы увидеть, какие скрипты загружены (вы также можете увидеть то же самое в инспекторе):

testacular --log-level debug start config/testacular.conf.js

В angular.mock.injectдокументах включают в себя довольно полный пример.


Пожалуй, стоит отметить, что moduleтеперь работает и с мокко
Робин-Гуди

11

Мы используем «модуль» без «углового» в наших модульных тестах, и он отлично работает.

CoffeeScript:

describe 'DiscussionServicesSpec', ->
    beforeEach module 'DiscussionServices'
    beforeEach inject ... etc.

который компилируется в

JavaScript:

describe('DiscussionServices', function() {
    beforeEach(module('DiscussionServices'));
    beforeEach(inject(function ... etc.

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

ReferenceError: Can't find variable: module

(Наши тесты проходят через PhantomJS)


2
В заключение можно сказать, что angular-mocks - это требование.
Адриан

3

Я включил angular-mocks.js в свою конфигурацию кармы, но все равно получал ошибку. Оказывается, порядок важен в массиве файлов. (да) Так же, как в заголовке html-документа, если скрипт вызывает angular до его определения, возникает ошибка. Поэтому мне просто нужно было включить свой app.js после angular.js и angular-mocks.js.


0

Если вы используете Yeoman и его angular-generator, вы, вероятно, получите эту ошибку.
Я исправил это, скопировав файл angular-mocks.js из каталога bower_components / angular-mocks в каталог test / mock, особенно когда вы делаете Учебник (._.) . Конечно, вы должны быть уверены, что ваш файл karma.conf.js настроен правильно.
Приветствую!


0

У меня была такая же проблема, когда я делал что-то вроде var module = angular.module('my',[]). Мне нужно было убедиться, что он окружен IIFE

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.