El servicio de prueba en el módulo de devoluciones angulares no está definido

127

Estoy tratando de ejecutar la prueba de unidad de servicio predeterminada en mi proyecto (Tomado del proyecto Angular Seed en GitHub), pero sigo recibiendo el error "el módulo no está definido".

He leído que podría tener algo que ver con el orden de los archivos JavaScript referenciados , pero parece que no puedo hacer que funcione, así que espero que alguno de ustedes pueda ayudar.

Mi configuración para la prueba se ve así:

basePath = '../';

archivos = [
'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 ',
' prueba / unidad / *. js '];

autoWatch = true;

navegadores = ['Chrome'];

junitReporter = {archivo de salida: 'test_out / unit.xml', suite: 'unit'};

El servicio tiene el siguiente aspecto:

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

La prueba se ve así:

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

Y el error al ejecutar la prueba a través de testacular es este:

ReferenceError: el módulo no está definido

Dofs
fuente
2
¿Puedes compartir tu proyecto en alguna parte? Podría ser capaz de ayudar. ¿Intentó activar el nivel de DEPURACIÓN para testacular para ver qué archivos se cargan realmente en función de su configuración? Por ahora, la parte sospechosa es este patrón: public / javascripts / lib / angular-.js: ¿con qué debería coincidir?
pkozlowski.opensource
@ JohnDoe Gracias, eso funcionó. Si agrega una respuesta, la marcaré como resuelta. La razón fue que estaba siguiendo el proyecto semilla, que lo hizo de esa manera y que funcionó. No sé si es porque era una versión anterior.
Dofs
@Dofs ¿Son los errores tipográficos "'public / javascripts / lib / angular-.js'," y "'public / controllers / .js'"?
Ryan O'Neill
@ RyanO'Neill lo siento, sí, esto fue un error tipográfico.
Dofs

Respuestas:

260

Te falta el archivo angular-mocks.js .

John Doe
fuente
8
Tenga en cuenta que angular.moduley noangular.mock.module son lo mismo. La window.modulefunción es un alias para angular.mock.module. Vea esta respuesta para más.
Tim Schaub
Como dice el comentario anterior, angular.module no es un alias para angular.mock.module.
Filippo De Luca
77
Esta respuesta sería mucho más útil si ofreciera algún consejo sobre cómo proporcionar dicho archivo. Necesitaba instalar Bower, luego NgMocks.
isherwood
44
La respuesta proporciona solo una parte de la solución. Esto es en realidad un comentario y no una explicación. Algunas de las respuestas a continuación son mucho más detalladas.
Gerome Bochmann
1
Para los principiantes, debe agregar una referencia angular-mocksen el karma.conf.jsarchivo y ejecutar las pruebas a través de Karma, no de Jasmine. De esta manera, cuando se ejecuta Karma, recoge las angular-mocksextensiones y las incorpora al entorno.
Lucas
41

Tuve el mismo problema y entendí por qué no funcionaba: el jazmín jasmine.js debe ser referenciado ANTES del archivo angular-mocks.js. De hecho, angular-mocks.js comprueba si Jasmine está cargado, y solo si lo está, agregará la función del módulo a la ventana.

Aquí hay un extracto del código Angular Mocks:

(Edite después de los pocos comentarios sobre 'piratería' que tenía a continuación: esto es solo un extracto del código, esto no es algo que necesite escribir usted mismo, ¡ya está allí!)

window.jasmine && (function(window) {

[...]

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

En pocas palabras: solo haga referencia a su jasmine.js antes de angular-mocks.js y listo.

Antoine Jaussoin
fuente
Esto también se puede resolver asegurándose de que los archivos jazmín javascript estén cargados antes de los simulacros angulares. Solución más limpia que hacer cambios extravagantes para que las cosas funcionen.
Foomip
@foomip ¿Quién sugirió hacer cambios hacky?
Stephen
Básicamente, insertó un hack en su aplicación para asegurarse de que las cosas se cargan de la manera correcta, y no me refería a hackear de una manera mala (no hay nada de malo en la forma en que escribió ese fragmento de código), pero qué sucede cuando un actualizar a jazmín o algo más hace que ese fragmento de tu se rompa o ya no funcione como se esperaba? Podría o no podría suceder, pero eso es una responsabilidad en su código ahora que podría evitarse, ¿no cree?
Foomip
@foomip: no estoy seguro de a qué se refiere, pero si se trata de mi código anterior, esto no fue escrito por mí, simplemente lo cito para explicar el problema. El código es parte de simulacros angulares. La solución es simplemente una cuestión de hacer referencia a un archivo antes que al otro.
Antoine Jaussoin
36

La window.modulefunción viene en angular-mocks.js y es una abreviatura de angular.mock.module. Como se menciona en los documentos , la modulefunción solo funciona con Jasmine.

Usando Testacular , se cargará el siguiente archivo de configuración de ejemplo 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'];

Y, como se sugiere en otra parte, puede ejecutar Testacular con registro de depuración para ver qué scripts se cargan (también puede ver lo mismo en el inspector):

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

Los angular.mock.injectdocumentos incluyen un ejemplo bastante completo.

Tim Schaub
fuente
Quizás valga la pena señalar que moduleahora también funciona con moca
Robin-Hoodie
11

Usamos 'módulo' sin 'angular' en nuestras pruebas unitarias y funciona bien.

CoffeeScript:

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

que compila a

JavaScript:

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

La única vez que veo algo como el error que describió es si en el archivo testacular.conf.js el archivo angular-mocks.js no aparece en la sección de archivos antes de las especificaciones que intentan usar 'módulo'. Si lo pongo después de mis pruebas en la lista de 'archivos' me sale

ReferenceError: Can't find variable: module

(Nuestras pruebas se ejecutan a través de PhantomJS)

Ryan O'Neill
fuente
2
La conclusión es que los simulacros angulares son un requisito.
Adrien
3

Había incluido angular-mocks.js en mi configuración de karma, pero aún recibía el error. Resulta que el orden es importante en la matriz de archivos. (duh) Al igual que en la cabeza de un documento html, si un script llama angular antes de que se defina, y se produce un error. Así que solo tuve que incluir mi app.js después de angular.js y angular-mocks.js.

Erik
fuente
0

Si está utilizando Yeoman y su generador angular, probablemente obtenga este error. Especialmente cuando haces el Tutorial (._.)
Lo arreglé, copiando el archivo angular-mocks.js, del directorio bower_components / angular-mocks al directorio test / simulacro. Por supuesto, debe asegurarse de que su archivo karma.conf.js esté configurado correctamente.
¡Saludos!

alxU
fuente
0

Tuve este mismo problema cuando estaba haciendo algo así var module = angular.module('my',[]). Necesitaba asegurarme de que estuviera rodeado por IIFE

Jackie
fuente