unit tutorial test run karma e2e and templates angularjs testing directive karma-runner

templates - tutorial - AngularJS+Karma+Ng-html2js=> Error al crear una instancia del módulo... html



run unit test angular (4)

No puedo hacer que Karma trabaje para directivas que tienen plantillas externas.

Aquí está mi archivo de configuración karma:

preprocessors: { ''directives/loading/templates/loading.html'': ''ng-html2js'' }, files: [ ... ''directives/loading/templates/loading.html'', ] ngHtml2JsPreprocessor: { prependPrefix: ''/app/'' },

En el archivo de la directiva:

... templateUrl: ''/app/directives/loading/templates/loading.html'' ...

En el archivo de especificaciones:

describe(''Loading directive'', function() { ... beforeEach(module(''/app/directives/loading/templates/loading.html'')); ... });

Obtuve el siguiente error :

Error al crear una instancia del módulo /app/directives/loading/templates/loading.html debido a: Error: No hay módulo: /app/directives/loading/templates/loading.html

Si modifico el código fuente del preprocesador karma-ng-html2js para imprimir el resultado del archivo generado, obtengo:

angular.module(''/app/directives/loading/templates/loading.html'', []).run(function($templateCache) { $templateCache.put(''/app/directives/loading/templates/loading.html'', ''<div ng-hide="hideLoading" class="loading_panel">/n'' + '' <div class="center">/n'' + '' <div class="content">/n'' + '' <span ng-transclude></span>/n'' + '' <canvas width="32" height="32"></canvas>/n'' + '' </div>/n'' + '' </div>/n'' + ''</div>''); });

Así que parece que el archivo JS generado es correcto pero no está cargado por karma ...

Además, si uso la depuración a nivel de registro, aquí están las líneas relacionadas con la plantilla:

DEBUG [preprocessor.html2js]: Procesando "/home/rightink/public_html/bo2/master/web/app/directives/loading/templates/loading.html"

DEBUG [watcher]: archivos resueltos:

/correct/path/to/the/app/directives/loading/templates/loading.html.js

Me estoy perdiendo de algo ?

Gracias,


El problema puede ser que las rutas relativas especificadas en file sección del file se expandan a las completas.

Algo como directives/loading/templates/loading.html /home/joe/project/angular-app/directives/loading/templates/loading.html => /home/joe/project/angular-app/directives/loading/templates/loading.html

... y luego, las plantillas se registran con sus rutas completas.

La solución es configurar el preprocesador ng-html2js para eliminar la parte absoluta de las rutas de la plantilla. Por ejemplo, en el archivo karma.conf.js agregue la directiva stripPrefix así:

ngHtml2JsPreprocessor: { // strip this from the file path stripPrefix: ''.*/project/angular-app/'' prependPrefix: ''/app/'' }

Tenga en cuenta que stripPrefix es una expresión regular.


Estoy en el proceso de aprender AngularJS y encontré el mismo problema. No tengo idea de por qué, pero cambiar el puerto en karma.conf.js lo solucionó para mí.

module.exports = function(config){ config.set({ ... port: 9877, ... }); };

Editar:

Después de un poco más de pruebas, descubrí que el problema solo estaba ocurriendo en Chrome y que se resolvió borrando explícitamente todo el historial del navegador (Ctrl + F5 no funcionó).


Puede hacer que el preprocesador almacene en caché sus plantillas en un módulo, que luego se puede incluir antes de sus pruebas:

karma.conf.js

files: [ ... ''app/**/*.html'' ], preprocessors: { ''app/**/*.html'': [''ng-html2js''] }, ngHtml2JsPreprocessor: { moduleName: ''templates'' },

archivo directivo

... templateUrl: ''app/path-to-your/template.html'', ...

archivo de especificaciones

describe(''My directive'', function() { beforeEach(module(''templates'')); ... });


Puede que este no sea su problema exacto, pero en nuestra aplicación necesitábamos agregar lo siguiente a karma.conf.js:

ngHtml2JsPreprocessor: { cacheIdFromPath: function(filepath) { return ''/vision/assets/'' + filepath; } }

La configuración de preprocesadores correspondiente se ve así:

preprocessors: { ''views/**/*.html'': ''html2js'' },

Mi entendimiento fue que esto se debió al uso de URL absolutas en AngularJS al especificar plantillas, ¿qué karma estaba reescribiendo al ejecutar pruebas?

De todos modos espero que esto ayude.