Les tests de karma ne semblent pas charger mon contrôleur angularjs
-
21-12-2019 - |
Question
Je gère mes tests angulaires avec karma, mon application fonctionne bien dans le navigateur, mais les tests échouent et je soupçonne de mauvais paramètres.
Voici les contrôleurs et les tests:
// app/scripts/controllers/main.js
'use strict';
angular.module('GloubiBoulgaClientApp')
.controller('MainCtrl', function ($scope) {
});
Voici le fichier de test:
'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);
});
});
Le 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
});
};
L'erreur 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)
Je me demande pourquoi cela se produit, j'ai essayé de trouver une documentation sur l'initialisation du karma avec angularjs. Mais la plus documentation que j'ai trouvée n'est que le tutoriel factice qui répète le même motif (comme la liste mannequin ToDo, mais avec des téléphones ...)
Il semble que $ contrôleurprovide.register échoue pour résoudre le nom de mon contrôleur. Mais les tests de directives fonctionnent correctement ...
Merci de votre attention.
Modifier les notes: J'ai remplacé le contrôleur PersonCtrl par MAINCTRL dans ce fil car il confondait des gens sur où regarder. Maintenant Mainctrl est l'exemple le plus simple que j'ai trouvé.
Ce problème n'affecte que mes contrôleurs (tous), mais les tests de services et directives fonctionnent comme prévu
La solution
J'ai résolu mon problème, j'ai passé près d'une semaine pour comprendre pourquoi cela ne fonctionnait pas.
J'aimerais vous avertir, que Karma StackTrace et Rapports d'erreur , même en mode de débogage, n'apparaissions pas des indices et
En creuser dans mes répertoires, j'ai trouvé un * .js qui n'étaient pas chargés dans l'indice de production, mais par le modèle de globe dans les tests.
Leçon apprise: Ne faites pas confiance à des tests (mais que dois-je faire confiance à ce moment-là?). Supprimer les fichiers que vous n'utilisez pas / teste.
Merci à tous ceux qui ont essayé de résoudre ce problème.
Autres conseils
Je pense que le problème principal provient du 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'
],
Suppression des fichiers * et spécifier des fichiers un par un dans le bon ordre, car si l'on est chargé avant d'un autre, il peut se casser.
Edit: Ajoutez vos fichiers dans le même ordre que votre index.html
Regardant cela, je me demande si le message d'erreur est confus.
dans la trace de la pile, je peux voir
TypeError: 'undefined' is not an object (evaluating 'scope.awesomeThings.length')
et de l'exemple, il semble que vous n'ayez pas défini de propriétés sur la portée de votre contrôleur.
Avez-vous toujours le problème si vous ajoutez
$scope.awesomeThings = [];
à votre contrôleur?
Si vous utilisez le dernier angulaire et également à l'aide de Module d'itinéraire angulaire , vous devez inclure le script angulaire dans le fichier Conf de Karma:
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'
],
J'ai eu ce problème et l'ajout au fichier Karma a fait le tour.