Il servizio di test nel modulo Ritorni angolari non è definito


127

Sto cercando di eseguire il test dell'unità di servizio predefinito nel mio progetto (Tratto dal progetto Angular Seed su GitHub), ma continuo a ricevere l'errore "modulo non definito".

Ho letto che potrebbe avere a che fare con l'ordine dei file JavaScript di riferimento , ma non riesco a farlo funzionare, quindi spero che uno di voi possa essere in grado di aiutare.

La mia configurazione per il test è simile alla seguente:

basePath = '../';

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

autoWatch = true;

browser = ['Chrome'];

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

Il servizio è simile al seguente:

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

Il test è simile al seguente:

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

E l'errore durante l'esecuzione del test attraverso testacular è questo:

ReferenceError: il modulo non è definito


2
puoi condividere il tuo progetto da qualche parte? Potrei essere in grado di aiutare. Hai provato ad attivare il livello DEBUG per testacular per vedere quali file sono effettivamente caricati in base alla tua configurazione? Per ora la parte sospetta è questo scalpiccio: public / javascripts / lib / angular-.js - cosa dovrebbe corrispondere?
pkozlowski.opensource,

@JohnDoe Grazie che ha funzionato. Se aggiungi una risposta, la contrassegnerò come risolta. Il motivo era che stavo seguendo il progetto seed, che lo faceva in quel modo e che funzionava. Non so se è perché era una versione precedente.
DOF

@Dofs "" public / javascripts / lib / angular-.js ', "e"' public / controller / .js '"sono errori di battitura?
Ryan O'Neill,

@ RyanO'Neill dispiace, sì, questo era un errore di battitura.
Dofs,

Risposte:


260

Manca il file angular-mocks.js .


8
Si noti che angular.modulee nonangular.mock.module sono gli stessi. La funzione è un alias per . Vedi questa risposta per di più. window.moduleangular.mock.module
Tim Schaub,

Come dice il commento precedente, angular.module non è un alias per angular.mock.module.
Filippo De Luca,

7
Questa risposta sarebbe molto più utile se offrisse qualche consiglio su come fornire tale file. Avevo bisogno di installare Bower, quindi NgMocks.
Isherwood,

4
La risposta fornisce solo una parte della soluzione. Questo è in realtà un commento e non una spiegazione. Alcune delle risposte di seguito sono molto più dettagliate.
Gerome Bochmann,

1
Per i principianti, è necessario aggiungere un riferimento angular-mocksnel karma.conf.jsfile ed eseguire le prove attraverso Karma, non Jasmine. In questo modo, quando Karma viene eseguito, raccoglie le angular-mocksestensioni e le incorpora nell'ambiente.
Luca,

41

Ho avuto lo stesso problema e ho capito perché non funzionava: il javascript jasmine.js deve essere referenziato PRIMA del file angular-mocks.js. Infatti, angular-mocks.js controlla se Jasmine è caricato e solo se lo è aggiunge la funzione del modulo alla finestra.

Ecco un estratto del codice di Angular Mocks:

(Modifica dopo i pochi commenti sull'hacking che ho avuto di seguito: questo è solo un estratto del codice, questo non è qualcosa che devi scrivere da solo, è già lì!)

window.jasmine && (function(window) {

[...]

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

In breve: basta fare riferimento a jasmine.js prima di angular-mocks.js e partire.


Questo può anche essere risolto assicurandosi che i file javascript jasmine siano caricati prima dei mock angolari. Soluzione più pulita rispetto a fare cambiamenti alterati per far funzionare le cose.
Foomip

@foomip Chi ha suggerito di apportare modifiche confuse?
Stephen,

In sostanza hai inserito un hack nella tua app per assicurarti che le cose si caricino nel modo giusto - e non intendevo hack in un modo cattivo (non c'è niente di sbagliato nel modo in cui hai scritto quel frammento di codice) ma cosa succede quando un l'aggiornamento al gelsomino o qualcos'altro causa la rottura di questo frammento o il mancato funzionamento del previsto? Potrebbe o non potrebbe accadere, ma questa è una responsabilità nel tuo codice ora che potrebbe essere evitata, non credi?
Foomip

@foomip: Non sono sicuro di cosa ti riferisca, ma se si tratta del mio codice sopra, questo non è stato scritto da me, lo sto semplicemente citando per spiegare il problema. Il codice fa parte di derisioni angolari. La correzione consiste semplicemente nel fare riferimento a un file prima dell'altro.
Antoine Jaussoin,

36

La window.modulefunzione è disponibile in angular-mocks.js ed è una scorciatoia per angular.mock.module. Come menzionato nei documenti , la modulefunzione funziona solo con Jasmine.

Utilizzando Testacular , verrà caricato il seguente file di configurazione di esempio 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'];

E, come suggerito altrove, puoi eseguire Testacular con la registrazione di debug per vedere quali script sono caricati (puoi anche vedere lo stesso nella finestra di ispezione):

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

I angular.mock.injectdocumenti includono un esempio abbastanza completo.


Forse vale la pena notare che moduleora funziona anche con la moka
Robin-Hoodie,

11

Usiamo 'module' senza 'angular' nei nostri test unitari e funziona benissimo.

CoffeeScript:

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

che compila a

JavaScript:

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

L'unica volta che vedo qualcosa di simile all'errore che hai descritto è se nel file testacular.conf.js il file angular-mocks.js non è elencato nella sezione dei file prima che le specifiche tentino di utilizzare 'module'. Se lo inserisco dopo i miei test nell'elenco "file", ottengo

ReferenceError: Can't find variable: module

(I nostri test vengono eseguiti tramite PhantomJS)


2
La cosa da concludere è che le derisioni angolari sono un requisito.
Adrien,

3

Avevo incluso angular-mocks.js nella mia configurazione del karma, ma continuavo a riscontrare l'errore. Si scopre che l'ordine è importante nell'array di file. (duh) Proprio come nella testa di un documento html, se uno script chiama angolare prima che sia definito e si verifica un errore. Quindi ho dovuto includere il mio app.js dopo angular.js e angular-mocks.js.


0

Se stai usando Yeoman e il suo generatore angolare, probabilmente ottieni questo errore. Soprattutto quando esegui il Tutorial (._.) L'
ho corretto copiando il file angular-mocks.js, dalla directory bower_components / angular-mocks alla directory test / mock. Ovviamente devi essere sicuro che il tuo file karma.conf.js sia configurato correttamente.
Saluti!


0

Ho avuto lo stesso problema quando stavo facendo qualcosa del genere var module = angular.module('my',[]). Dovevo assicurarmi che fosse circondato da IIFE

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.