web-dev-qa-db-fra.com

Service de test dans Angular angulaire retourne n'est pas défini

J'essaie d'exécuter le test d'unité de service par défaut dans mon projet (extrait du module Angular Seed projet sur GitHub)], mais l'erreur continue à me générer l'erreur " n'est pas défini".

J'ai lu que cela pourrait être quelque chose à voir avec l'ordre des fichiers JavaScript référencés , mais je n'arrive pas à le faire fonctionner, alors j'espère qu'un de vous pourra peut-être vous 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/contrôleurs/
. js',
'public/directives.js',
'public/filters.js',
'public/services.js',
JASMIN,
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 à ceci:

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 via testacular est la suivante:

ReferenceError: le module n'est pas défini

126
Dofs

Le fichier angular-mocks.js est manquant.

259
John Doe

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

Voici un extrait de Angular Mocks code:

(Éditez après les quelques commentaires sur le "piratage" que j'ai eu ci-dessous: ceci est juste 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;
    /////////////////////
    [...]
  };

En un mot: Il suffit de référencer votre jasmine.js avant angular-mocks.js et c'est parti.

40
Antoine Jaussoin

Le window.module La fonction entre angular-mocks.js et est un raccourci pour angular.mock.module. Comme mentionné dans the docs , la fonction module ne fonctionne qu'avec Jasmine.

Avec Testacular , l'exemple de fichier de configuration suivant chargera 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 suggéré ailleurs, vous pouvez exécuter Testacular avec la 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

Le angular.mock.inject _docs inclure un exemple assez complet.

35
Tim Schaub

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

CoffeeScript:

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

qui compile à

JavaScript:

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

Le seul cas où je vois quelque chose comme l'erreur que vous avez décrite 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 essayant d'utiliser "module". Si je le mets après mes tests dans la liste des fichiers, je reçois

ReferenceError: Can't find variable: module

(Nos tests sont exécutés via PhantomJS)

11
Ryan O'Neill

J'avais inclus angular-mocks.js dans ma configuration de karma, mais j'avais toujours l'erreur. Il s'avère que l'ordre est important dans le tableau de fichiers. (duh) Tout comme dans la tête d'un document html, si un script appelle angular avant qu'il soit défini, et qu'une erreur se produise. Il a donc simplement fallu inclure mon app.js après angular.js et angular-mocks.js.

3
Erik

J'ai eu le même problème quand je faisais quelque chose comme var module = angular.module('my',[]). Je devais m'assurer qu'il était entouré de l'IIFE

0
Jackie

Si vous utilisez Yeoman et son générateur d'angle, vous obtiendrez probablement cette erreur. Surtout quand vous faites le tutoriel (._.)
Je l'ai corrigé, en copiant le fichier angular-mocks.js, du répertoire bower_components/angular-mocks au répertoire test/mock. Bien sûr, vous devez être sûr que votre fichier karma.conf.js est correctement configuré.
Salutations!

0
alxU