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

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

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

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

basePath = '../';

files = [
'Общественность/JavaScripts/Library/JQuery-1.8.2.js',
'Общественности/JavaScripts/Library/angular.js',
'Общественности/JavaScripts/Library/angular -. JS',
 'Общественного/app.js',
'общественные/контроллеры/.js',
'общественные/directives.js',
'Общественного/filters.js',
'Общественного/services.js',
ЖАСМИН,
JASMINE_ADAPTER,
'Общественности/JavaScripts/Library/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: модуль не определен

Ответ 1

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

Ответ 2

У меня была такая же проблема, и я понял, почему она не работает: Javascript javascript 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 и отпустите.

Ответ 3

Функция window.module поставляется в angular-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 docs содержит довольно полный пример.

Ответ 4

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

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)

Ответ 5

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

Ответ 6

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

Ответ 7

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