unit testing - unitarias - El servicio de prueba en el módulo de devoluciones angulares no está definido
test unitarios angular 5 (7)
Estoy intentando ejecutar la prueba de la unidad de servicio predeterminada en mi proyecto (tomada desde el proyecto Angular Seed en GitHub), pero sigo obteniendo 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 a los que se hace referencia , pero parece que no puedo hacerlo funcionar, 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'',
JAZMÍN,
JASMINE_ADAPTER,
''public / javascripts / lib / angular-mocks.js'',
''prueba / unidad / *. js''];autoWatch = verdadero;
navegadores = [''Chrome''];
junitReporter = {outputFile: ''test_out / unit.xml'', suite: ''unit''};
El servicio se ve así:
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
Había incluido angular-mocks.js en mi configuración de karma, pero seguía recibiendo el error. Resulta que el orden es importante en la matriz de archivos. (duh) Al igual que en el encabezado 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.
La función window.module
viene en angular-mocks.js y es una abreviación de angular.mock.module
. Como se menciona en los documentos , la función del module
solo funciona con Jasmine.
Usando Testacular , el siguiente archivo de configuración de ejemplo cargará 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 otro lugar, puede ejecutar Testacular con registro de depuración para ver qué scripts están cargados (también puede ver lo mismo en el inspector):
testacular --log-level debug start config/testacular.conf.js
Los documentos angular.mock.inject
incluyen un ejemplo bastante completo.
Le falta el archivo angular-mocks.js .
Si está usando Yeoman y su generador angular, probablemente obtenga este error. Especialmente cuando haces el Tutorial (._.)
Lo arreglé copiando el archivo angular-mocks.js, desde el directorio bower_components / angular-mocks al directorio test / mock. Por supuesto, debe estar seguro de que su archivo karma.conf.js está configurado correctamente.
¡Saludos!
Tuve el mismo problema cuando estaba haciendo algo como var module = angular.module(''my'',[])
. Necesitaba asegurarme de que estaba rodeado por IIFE
Tuve el mismo problema, y entendí por qué no funcionaba: el javascript jazmine.js debe estar referenciado ANTES del archivo angular-mocks.js. De hecho, angular-mocks.js comprueba si Jasmine está cargada, y solo si lo es agregará la función del módulo a la ventana.
Aquí hay un extracto del código de Angular Mocks:
(Editar 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 necesites escribir tú 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: simplemente haga referencia a su jasmine.js antes de angular-mocks.js y listo.
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 así como el error que describes 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 ''module''. Si lo pongo después de mis pruebas en la lista de ''archivos'' consigo
ReferenceError: Can''t find variable: module
(Nuestras pruebas se están ejecutando a través de PhantomJS)