Служба тестування в модулі кутових повернень не визначена


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 / direktives.js ',
' public / filters.js ',
' public / services.js ',
JASMINE,
JASMINE_ADAPTER,
' public / javascripts / lib / angular-mocks . js ',
' test / unit / *. js '];

autoWatch = вірно;

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

junitReporter = {outputFile: 'test_out / unit.xml', suite: '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');
    }));
  });
});

І помилка при проведенні тесту через тестакуляр така:

ReferenceError: модуль не визначений


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

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

@Dofs Чи є "'public / javascripts / lib / angular-.js'," та "'public / controllers / .js'" помилки?
Райан О'Нілл

@ RyanO'Neill вибачте, так, це була помилка.
Дофс

Відповіді:


260

У вас відсутній файл angular-mocks.js .


8
Слід зазначити , що angular.moduleі angular.mock.moduleце НЕ те ж саме. window.moduleФункція є псевдонімом angular.mock.module. Дивіться цю відповідь для отримання додаткової інформації.
Тім Шауб

Як говориться в попередньому коментарі, angular.module не є псевдонімом для angular.mock.module.
Філіппо Де Лука

7
Ця відповідь була б набагато кориснішою, якби вона запропонувала будь-які поради щодо надання цього файлу. Мені потрібно було встановити Bower, потім NgMocks.
Ізервуд

4
Відповідь подає лише частину рішення. Це насправді коментар, а не пояснення. Деякі з наведених нижче відповідей набагато детальніші.
Гером Бохман

1
Для початківців, вам потрібно додати посилання angular-mocksв karma.conf.jsфайл і запускати тести Карми, а НЕ Жасмин. Таким чином, коли Карма запускається, вона збирає angular-mocksрозширення та включає їх у навколишнє середовище.
Лука

41

У мене була така ж проблема, і я зрозумів, чому це не працює: ЯСЛО Jasmine.js повинен бути посиланим ДО ПЕРЕД файлом angular-mocks.js. Дійсно, angular-mocks.js перевіряє, чи завантажується Жасмін, і лише якщо він є, він додасть функцію модуля до вікна.

Ось витяг з коду 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 і не підете.


Це також можна вирішити, переконавшись, що файли JavaScript Жасмін завантажуються перед кутовими макетами. Чистіше рішення, ніж внесення хакейних змін, щоб налагодити роботу.
foomip

@foomip Хто запропонував внести хакейні зміни?
Стівен

Ви, по суті, вставили хак у свій додаток, щоб переконатися, що речі завантажуються правильно - і я не мав на увазі зламати погано (немає нічого поганого в тому, як ви написали цей фрагмент коду), але що відбувається, коли оновлення до жасмину чи чогось іншого спричиняє, що фрагмент вашої ламається чи більше не працює так, як очікувалося? Це могло чи не могло статися, але це відповідальність у вашому коді, яку тепер можна уникнути, не думаєте?
foomip

@foomip: Я не впевнений, на що ви звертаєтесь, але якщо мова йде про мій код вище, це не було написано мною, я просто цитую його, щоб пояснити проблему. Код є частиною кутових макетів. Виправлення - це лише питання посилання одного файлу на інший.
Антуан Жауссон

36

window.moduleФункція спадає на кутовому-mocks.js і є скороченням для angular.mock.module. Як було сказано в документах , moduleфункція працює лише з Жасмін.

Використовуючи 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 не вказаний у розділі файлів перед специфікаціями, що намагаються використовувати 'module'. Якщо я поміщую її після моїх тестів у списку "файлів", який я отримую

ReferenceError: Can't find variable: module

(Наші тести проводяться через PhantomJS)


2
Слід зробити висновок, що кутові макети - це вимога.
Адрієн

3

Я включив angular-mocks.js у свою карму конфігурацію, але все ще отримував помилку. Виявляється, порядок важливий у масиві файлів. (duh) Так само, як і в голові документа html, якщо скрипт дзвонить кутовим перед його визначенням, і виникає помилка. Тому я просто повинен був включити свої програми app.js після angular.js та angular-mocks.js.


0

Якщо ви використовуєте Yeoman та його кутовий генератор, ви, ймовірно, отримаєте цю помилку. Особливо, коли ви робите Підручник (._.),
Я його виправив, скопіювавши файл angular-mocks.js, з dir bower_components / angular-mocks в тест / mock dir. Звичайно, ви повинні бути впевнені, що ваш файл karma.conf.js правильно налаштований.
Привітання!


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.