Vous avez raison que c'est lié à ngMock. Le ngMock module est automatiquement chargé pour chaque Angulaire de test, et il initialise la maquette $httpBackend
pour gérer toute utilisation de l' $http
service, qui inclut le modèle de l'extraction. Le système de template essaie de charger le template par $http
et il devient un "inattendu de la demande" à la maquette.
Ce que vous avez besoin d'un moyen de pré-charger les modèles dans l' $templateCache
alors qu'ils sont déjà disponibles lorsque Angulaire de la demande, sans l'aide d' $http
.
La Solution Préférée: Karma
Si vous êtes à l'aide de Karma pour exécuter vos tests (et vous devriez), vous pouvez le configurer pour charger les modèles pour vous avec le ng-html2js de préprocesseur. Ng-html2js lit les fichiers HTML que vous spécifiez et les convertit en angle module de pré-charge le $templateCache
.
Étape 1: Activer et configurer le préprocesseur dans votre karma.conf.js
// karma.conf.js
preprocessors: {
"path/to/templates/**/*.html": ["ng-html2js"]
},
ngHtml2JsPreprocessor: {
// If your build process changes the path to your templates,
// use stripPrefix and prependPrefix to adjust it.
stripPrefix: "source/path/to/templates/.*/",
prependPrefix: "web/path/to/templates/",
// the name of the Angular module to create
moduleName: "my.templates"
},
Si vous utilisez Yeoman à l'échafaud votre application de cette config va travailler
plugins: [
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-ng-html2js-preprocessor'
],
preprocessors: {
'app/views/*.html': ['ng-html2js']
},
ngHtml2JsPreprocessor: {
stripPrefix: 'app/',
moduleName: 'my.templates'
},
Étape 2: Utiliser le module dans vos tests
// my-test.js
beforeEach(module("my.templates")); // load new module containing templates
Pour un exemple complet, regardez cet exemple canonique Angulaires test gourou Vojta Jina. Il comprend un ensemble d'installation: karma config, des modèles et des tests.
Un Non-Karma Solution
Si vous n'utilisez pas de Karma, pour quelque raison que ce soit (la paresse, de la bêtise, inflexible processus de construction dans l'ancienne application, etc) et sont tout simplement de le tester dans un navigateur, j'ai trouvé que vous pouvez obtenir autour de ngMock prise de $httpBackend
à l'aide d'un raw XHR pour aller chercher le modèle réel et de l'insérer dans l' $templateCache
. Cette solution est beaucoup moins flexible, mais il fait le travail pour l'instant.
// my-test.js
// Make template available to unit tests without Karma
//
// Disclaimer: Not using Karma may result in bad karma.
beforeEach(inject(function($templateCache) {
var directiveTemplate = null;
var req = new XMLHttpRequest();
req.onload = function() {
directiveTemplate = this.responseText;
};
// Note that the relative path may be different from your unit test HTML file.
// Using `false` as the third parameter to open() makes the operation synchronous.
// Gentle reminder that boolean parameters are not the best API choice.
req.open("get", "../../partials/directiveTemplate.html", false);
req.send();
$templateCache.put("partials/directiveTemplate.html", directiveTemplate);
}));
Sérieusement, si. L'Utilisation De Karma.