Las pruebas de karma no parecen cargar mi controlador angularjs
-
21-12-2019 - |
Pregunta
Ejecutar mis pruebas angulares con el karma, mi aplicación se está ejecutando bien en el navegador, pero las pruebas fallan y estoy sospechando ajustes incorrectos.
Aquí están los controladores y pruebas:
// app/scripts/controllers/main.js
'use strict';
angular.module('GloubiBoulgaClientApp')
.controller('MainCtrl', function ($scope) {
});
Aquí está el archivo de prueba:
'use strict';
describe('Controller: MainCtrl', function () {
// load the controller's module
beforeEach(module('GloubiBoulgaClientApp'));
var MainCtrl,
scope;
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
MainCtrl = $controller('MainCtrl', {
$scope: scope
});
}));
it('should attach a list of awesomeThings to the scope', function () {
expect(true).toBe(true);
});
});
El karma conf
module.exports = function(config) {
config.set({
// base path, that will be used to resolve files and exclude
basePath: '',
// testing framework to use (jasmine/mocha/qunit/...)
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/angular-cookies/angular-cookies.js',
'app/bower_components/angular-sanitize/angular-sanitize.js',
'app/scripts/*.js',
'app/scripts/**/*.js',
'test/mock/**/*.js',
'test/spec/**/*.js'
],
// list of files / patterns to exclude
exclude: [],
// web server port
port: 8080,
// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers: ['PhantomJS'],
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false
});
};
El error OUPUT
PhantomJS 1.9.2 (Linux) Controller: MainCtrl should attach a list of awesomeThings to the scope FAILED
Error: [ng:areq] Argument 'MainCtrl' is not a function, got undefined
http://errors.angularjs.org/1.2.8-build.2094+sha.b6c42d5/ng/areq?p0=MainCtrl&p1=not%20a%20function%2C%20got% 2
0undefined
at assertArg (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angula
r.js:1362)
at assertArgFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angu
lar.js:1373)
at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.js:6763
at --obfuscated-path--GloubiBoulga/GloubiBoulgaClient/test/spec/controllers/main.js:15
at invoke (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular/angular.j
s:3704)
at workFn (--obfuscated-path--GloubiBoulga/GloubiBoulgaClient/app/bower_components/angular-mocks/angular -mocks.js:2120)
Me pregunto por qué sucede esto, intenté encontrar una documentación sobre la inicialización del karma con AngularJS. Pero la mayor documentación que encontré es solo tutorial ficticio que está repitiendo el mismo patrón (como la lista de techo de maniquí, pero con los teléfonos ...)
Parece que $ ControllerProvide.register no resuelve el nombre de My Controllers. Pero las pruebas de directivas están funcionando correctamente ...
Gracias por su atención.
Notas de edición: Reemplacé el controlador Personctrl por MainCtrl en este hilo porque estaba confundiendo a las personas sobre dónde mirar. Ahora MainCTRL es el ejemplo más simple que no encontré.
Este problema solo está afectando a mis controladores, (todos ellos), pero las pruebas de servicios y directivas están funcionando como se espera
Solución
Resolví mi problema, he pasado casi una semana para imaginarme por qué esto no funcionaba.
Me gustaría advertirle, que karma stacktrace y informes de errores , incluso en el modo de depuración, no estaban mostrando pistas y estaban principalmente mal parezas . He pasado tiempo en JavaScript Depurador saltando marco para marcar, para entender por qué mis controladores no están cargados.(Inspeccionar el registro de controladores de Angular, mostrado que estaba vacío)
Mientras cava en mis directorios, encontré un * .js que no se cargaron en el índice en la producción, sino por el patrón de globo en las pruebas.
Fue mi viejo servicio HTTP_ERTERCEPTOR que moví, pero no golpeó el archivo. Eliminar este archivo de buggy fijo el karma raro / jazmín / comportamiento angular.
LECCIÓN APRENDIDA: No confíe en la salida de las pruebas (pero ¿en qué debo confiar entonces?). Eliminar archivos que no está usando / Testing.
Gracias a todos los que intentaron resolver este problema.
Otros consejos
Creo que el problema principal proviene del karma conf:
files: [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/angular-cookies/angular-cookies.js',
'app/bower_components/angular-sanitize/angular-sanitize.js',
'app/scripts/*.js',
'app/scripts/**/*.js',
'app/scripts/**/**/*.js',
'test/mock/**/*.js',
'test/spec/**/*.js'
],
Extracción del * y especificando archivos uno por uno en el orden correcto, porque si uno se carga antes de otro, puede romper.
Editar: Agregue sus archivos en el mismo orden que su índice.html
Mirando esto Me pregunto si el mensaje de error es confuso las cosas.
en la traza de pila puedo ver
TypeError: 'undefined' is not an object (evaluating 'scope.awesomeThings.length')
y del ejemplo parece que no ha definido ninguna propiedad en el alcance en su controlador.
¿Todavía tiene el problema si agrega
$scope.awesomeThings = [];
¿A su controlador?
Si está utilizando la última angular y también usando el módulo de ruta angular , debe incluir el script de ruta angular en el archivo karma confes:
files: [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-route/angular-route.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/angular-cookies/angular-cookies.js',
'app/bower_components/angular-sanitize/angular-sanitize.js',
'app/scripts/*.js',
'app/scripts/**/*.js',
'app/scripts/**/**/*.js',
'test/mock/**/*.js',
'test/spec/**/*.js'
],
Tuve este problema y lo agregó al archivo de Karma hizo el truco.