Inclure les dépendances dans le Karma fichier de test Angulaire de l'app?
Je suis en train d'essayer de démarrer avec le Karma tests, en les ajoutant à un existant Angulaire de l'app.
C'est ma principale application fichier de définition:
angular
.module('myApp', [
'ngRoute',
'moduleAdherence'
]);
C'est mon contrôleur de fichier:
angular
.module('moduleAdherence', [])
.controller('AdherenceCtrl', ['$scope', function ($scope) {
$scope.awesomeThings = [1,2,3,4];
}]);
C'est mon premier coup de couteau à un fichier:
describe('Controller: AdherenceCtrl', function () {
beforeEach(module('myApp'));
var MainCtrl,
scope;
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
MainCtrl = $controller('AdherenceCtrl', {
$scope: scope
});
}));
it('should attach a list of awesomeThings to the scope', function () {
expect(scope.awesomeThings.length).toBe(4);
});
});
Lorsque j'essaie d'exécuter ce avec grunt test
, il échoue avec l'erreur suivante:
Uncaught Error: [$injector:nomod] Module 'd3' is not available!
You either misspelled the module name or forgot to load it.
If registering a module ensure that you specify the dependencies
as the second argument.
http://errors.angularjs.org/1.2.0/$injector/nomod?p0=d3
at /Users/me/Dropbox/projects/myapp/app/bower_components/angular/angular.js:1498
Je ne comprends pas, parce que ce contrôleur ne pas Utiliser de D3. Je ne l'utilisation de D3 ailleurs dans l'application, dans une directive, mais je ne suis pas de l'enregistrer avec le module (j'utilise l'externe D3 fichier).
Pourquoi est-Karma remarquer D3? Ne devrait-elle pas être en mesure de tester ce contrôleur sans D3?
- Où est le module
myApp
défini? EtMainCtrl
? - Désolé - fautes de frappe lors du changement de nom pour la consommation publique, c'est corrigé. Le problème est toujours le même.
- Compris - j'ai dû charger les dépendances de manière explicite dans
karma.config.js
, dans lefiles
section. - super, merci de l'ajouter comme une solution!
- Utilisation
karma-angular-filesort
Vous devez vous connecter pour publier un commentaire.
Dans le karma fichier de configuration (karma.conf.js), vous devez définir toutes les bibliothèques.
etc.
A eu un problème similaire et ma solution (inspiré d'une certaine manière par @danba commentaire) a été de charger les scripts dans le
files
dans le exacte même ordre qu'ils ont été chargés dans le index.html.Dans mon cas, d'expansion des formes comme
app/scripts/**/*.js
ont été à l'origine de la difficulté à le karma, qui constamment jeté des erreurs.Peut-être pas la solution la plus élégante pour copier tous les scripts de définitions, mais il a travaillé à la fin, donc mon test pourrait finalement revenir en cours d'exécution. Espérons que cela aide.
EDIT: d'Édition parce qu'aujourd'hui j'ai probablement (et espérons) a obtenu le coup de ce qui n'allait pas ici. Il semble donc que le Karma n'est pas comme d'expansion des motifs lors de la même module est défini dans un fichier, et utilisé dans de nombreux fichiers différents. Disons que votre structure de dossier comme ceci:
Supposons que, dans
AuthService.js
vous avez votre définition de module pour tous vos services dans ce dossier, de sorte que le fichier commence par:Puis dans tous les autres fichiers que vous êtes tout simplement joindre d'autres services de ce même module. Dans l'image
tokenService.js
serait de commencer avec:Si tout reste cette façon, tout fonctionnera probablement. Mais si, par hasard, je définir le module dans l'autre sens, de sorte que le module de définition n'est pas plus dans la premier fichier de ce dossier, mais sur un autre que le Karma lit après
AuthService
puis il lèvera une erreur et de refuser d'effectuer les tests.Solution 1
Une solution pourrait être de mettre le module de définition dans son propre fichier, en commençant par un caractère de soulignement. Enfin, que tous les frères et sœurs fichiers dépendent que celle(s). Si le dossier ci-dessus, la structure devrait être:
Solution 2
Un autre - et probablement la meilleure solution est de marquer les fichiers où les modules sont définis avec un suffixe commun/extension par exemple
service.module.js
, alors que les fichiers qui en dépendent pourrait être nommé normalement commeauthService.js
,tokenService.js
.Le Karma de configuration au point de devenir quelque chose comme:
De cette façon, le karma va charger les modules définitions d'abord et ensuite les fichiers qui en dépendent.
J'ai aussi eu le même problème, dans mon cas, le problème s'est produite parce qu'il y avait plusieurs fichiers par module qui est une mauvaise pratique car nous pouvons point à ne pas initialisé module. Résolu ce problème en incluant simplement un fichier par module.
'app/scripts/app.js', 'app/scripts/**/*Module.js', 'app/scripts/*.js', 'app/scripts/**/*.js'
de sorte que tous les fichiers qui incluent des déclarations de module sont inclus avant que tous les fichiers qui peuvent exiger de l'modules.Toujours charger le non version minifiée angulaire dans le karma.
il affiche des erreurs et de vous aider à mieux connaître ce qu'il faut changer.
Dans votre cas, c'est l'ordre des fichiers en cours de chargement par le karma.
Vérifier votre index.html que vous ne comprennent pas quelque chose par une balise de script comme.
Tous les Javascript de votre fichier doit être dans votre karma.config.js
Voici une solution simple qui a fonctionné pour moi, basé sur la Solution ci-dessus #1 par @Nobita, ET @danba commentaire.
Dans karma.conf.js explicitement, en charge de la condition du fichier ci-dessus le modèle qui tire dans le reste:
Karma ne semble pas à l'esprit que le modèle correspond 'module.js'.