127 votes

Le service de test dans le module des retours Angular n'est pas défini

J'essaie d'exécuter le test unitaire du service par défaut dans mon projet (pris dans le projet Angular Seed sur GitHub), mais je continue à obtenir l'erreur "module is not defined".

J'ai lu que cela pouvait avoir un rapport avec l'ordre de la fichiers JavaScript référencés mais je n'arrive pas à le faire fonctionner, alors j'espère que l'un d'entre vous pourra m'aider.

Ma configuration pour le test ressemble à ceci :

basePath = '../' ;

fichiers = [
'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 ;

navigateurs = ['Chrome'] ;

junitReporter = { OutputFile : 'test_out/unit.xml', suite : 'unit'. } ;

Le service ressemble à ce qui suit :

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

Le test ressemble à ceci :

'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');
    }));
  });
});

Et l'erreur lors de l'exécution du test par testacular est la suivante :

ReferenceError : le module n'est pas défini

260voto

John Doe Points 2068

Il vous manque le angular-mocks.js fichier.

41voto

Antoine Jaussoin Points 647

J'avais le même problème, et j'ai compris pourquoi ça ne marchait pas : Le javascript jasmine.js doit être référencé AVANT le fichier angular-mocks.js. En effet, le fichier angular-mocks.js vérifie si Jasmine est chargé, et seulement s'il l'est, il ajoutera la fonction du module à la fenêtre.

Voici un extrait de code Angular Mocks :

(modification après les quelques commentaires sur le "piratage" que j'ai eus ci-dessous : ceci n'est qu'un extrait du code, ce n'est pas quelque chose que vous devez écrire vous-même, c'est déjà là !)

window.jasmine && (function(window) {

[...]

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

Donc, pour résumer, il suffit de référencer votre jasmine.js avant angular-mocks.js et c'est parti.

36voto

Tim Schaub Points 1948

El window.module intervient dans angular-mocks.js et est un raccourci pour angular.mock.module . Comme indiqué dans les docs le module ne fonctionne qu'avec Jasmine.

Utilisation de Testacular l'exemple de fichier de configuration suivant sera chargé 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'];

Et, comme cela a été suggéré ailleurs, vous pouvez exécuter Testacular avec une journalisation de débogage pour voir quels scripts sont chargés (vous pouvez également voir la même chose dans l'inspecteur) :

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

El angular.mock.inject docs comprennent un exemple assez complet.

11voto

Ryan O'Neill Points 2279

Nous utilisons "module" sans "angular" dans nos tests unitaires et cela fonctionne bien.

CoffeeScript :

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

qui se compile en

JavaScript :

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

La seule fois où je vois quelque chose comme l'erreur que vous avez décrite, c'est si, dans le fichier testacular.conf.js, le fichier angular-mocks.js n'est pas répertorié dans la section des fichiers avant les spécifications qui tentent d'utiliser " module ". Si je le place après mes tests dans la liste des fichiers, j'obtiens les résultats suivants

ReferenceError: Can't find variable: module

(Nos tests sont exécutés par PhantomJS).

3voto

Erik Points 58

J'avais inclus angular-mocks.js dans ma configuration karma, mais j'obtenais toujours l'erreur. Il s'avère que l'ordre est important dans le tableau des fichiers. (duh) Tout comme dans l'en-tête d'un doc html, si un script appelle angular avant qu'il ne soit défini, une erreur se produit. J'ai donc dû inclure mon app.js après angular.js et angular-mocks.js.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X