javascript - Los accesorios no se cargarán en Karma
gruntjs jasmine (1)
Si usa karma-jasmine-jquery
, puede establecer lo siguiente:
agréguelo como marco -
frameworks: [''jasmine-jquery'', ''jasmine'']
incluye tus accesorios como patrones debajo de la matriz de archivos -
{ pattern: ''test/fixtures/*.html'', included: false, served: true }
establece el camino usando
base/
tales comojasmine.getFixtures().fixturesPath = ''base/test/fixtures'';
en sus suites de prueba.cargue los accesorios en sus especificaciones de prueba -
loadFixtures(''index.html'');
karma-jasmine-jquery https://www.npmjs.com/package/karma-jasmine-jquery
Karma Config http://karma-runner.github.io/0.12/config/files.html
Actualización 02.16.16
Las versiones más nuevas de Chrome no permiten que el archivo: // URI lea otros archivos: // URI. En efecto, jasmine-jquery no puede cargar correctamente los accesorios en algunas versiones de Chrome. Una anulación de esto es ejecutar Chrome con un interruptor --allow-file-access-from-files
. https://github.com/velesin/jasmine-jquery#cross-domain-policy-problems-under-chrome
He intentado muchas cosas, pero parece que no puedo cargar un accesorio cuando ejecuto Karma. He intentado usar html2js
y karma-jasmine-jquery
html2js
hacia este último, pero estaré bien con el que tenga mi accesorio cargado en el DOM) -pero hasta donde sé, no se está cargando y adjunto al DOM cuando se ejecutan mis pruebas.
Mi estructura de directorio es bastante simple:
img/
↳ mac.png
↳ link.png
↳ pocketwatch.png
js/
↳ spriteloader.js
↳ spriteloader.spec.js
karma/
↳ imagelist.fix.html
↳ karma.conf.js
Gruntfile.coffee
index.html
grunt.config.coffee
package.json
Estos son los módulos de nodo que tengo instalados:
grunt 0.4.5
grunt-contrib-jshint 0.10.0
grunt-contrib-watch 0.6.1
grunt-karma 0.9.0
karma 0.12.23
karma-chrome-launcher 0.1.4
karma-firefox-launcher 0.1.3
karma-html2js-preprocessor": "^0.1.0",
karma-jasmine 0.2.0
karma-jasmine-jquery 0.1.1
karma-safari-launcher 0.1.1
karma-story-reporter 0.2.2
Y aquí está mi configuración de karma.conf.js
:
basePath: ''../'',
frameworks: [''jasmine-jquery'', ''jasmine''],
files: [
// Source and spec files
{
pattern: ''js/*.js'',
watched: true,
served: true,
included: true
},
// Fixtures
{
pattern: ''karma/*.fix.html'',
watched: false,
served: true,
included: false
}
],
exclude: [
],
preprocessors: {
},
reporters: [''story''],
port: 9018,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: [''Chrome'', ''Firefox'', ''Safari''],
singleRun: true
En mi especificación, empiezo mi describe()
con beforeEach()
que ejecuta las siguientes dos líneas:
jasmine.getFixtures().fixturesPath = ''../'';
jasmine.getFixtures().load(''/karma/imagelist.fix.html'');
Luego comienzan las funciones it()
. Están probando una función que agrega un detector de eventos a algunos elementos <img>
utilizando document.getElementById()
. Ahí es donde el accesorio debe entrar, porque sin él el getElementById()
devolverá null
. (¿Cuál es el problema al que estoy llegando?)
Recorrí la web durante casi todo un día buscando cosas para probar, pero parece que no puedo sacar nada de Karma aparte de TypeError: document.getElementById(...) is null
. He intentado cambiar mi configuración de Karama para que, en lugar de estar vacío, los preprocessors
tengan "**/*.html": []
en él para deshabilitar html2js
, pero eso no hizo nada. Intenté desactivar jasmine-jquery
y usar html2js
, pero apenas hay documentación sobre karma-html2js-preprocessor
, así que no puedo decir si lo estoy usando bien. (Por eso me inclino más hacia jasmine-jquery
.) Simplemente no puedo entender esto.
ACTUALIZACIÓN (3 OCT)
Encontré esta pregunta en Stack Overflow y probé la respuesta allí, pero no funcionó; todavía tengo el mismo comportamiento que he estado viendo. Mi karma.conf.js
ha cambiado desde arriba, pero en mi spriteloader.spec.js
cambié las llamadas de Jasmine a esto:
jasmine.getFixtures().fixturesPath = ''http://localhost:9019/base/karma/'';
jasmine.getFixtures().load(''imagelist.fix.html'');
También probé esto y obtuve el mismo resultado nuevamente:
jasmine.getFixtures().fixturesPath = ''http://localhost:9019/base/karma/'';
jasmine.getFixtures().load(''http://localhost:9019/base/karma/imagelist.fix.html'');
Luego encontré este tema en GitHub y cambié los preprocessors
en karma.conf.js
a este:
preprocessors: {
''**/*.html'': []
},
Y cambié las llamadas de Jasmine en mi especificación a esto:
var fixtures = jasmine.getFixtures();
fixtures.fixturesPath = ''base/karma/'';
fixtures.load(''imagelist.fix.html'');
Esto también dio como resultado el mismo comportamiento: TypeError: document.getElementById(...) is null
También encontré esta publicación y probé la configuración que se describe en ella, a excepción de la incorporación de JASMINE
y JASMINE_ADAPTER
a la sección de files
de karma.conf.js
pero sigo teniendo el mismo comportamiento.
Como tengo karma-jasmine-jquery
instalado localmente, señalé el script jasmine-jquery
así:
''node_modules/karma-jasmine-jquery/lib/jasmine-jquery.js''
Incluso intenté abandonar las llamadas de Jasmine e ir con una llamada AJAX en su lugar:
$(''#fixture'').remove();
$.ajax({
async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
dataType: ''html'',
url: ''../karma/imagelist.fix.html'',
success: function(data) {
$(''body'').append($(data));
}
});
Todavía tengo el mismo resultado, sin embargo. No estoy seguro de qué más puedo probar.
ACTUALIZACIÓN (4 OCT)
Encontré esta pregunta / respuesta en StackOverflow y traté de configurarla con html2js
según la solución allí. karma.conf.js
jasmine-jquery
de la sección de frameworks
de mi karma.conf.js
y agregué una sección de plugins
que se ve así:
plugins: [
''karma-chrome-launcher'',
''karma-firefox-launcher'',
''karma-html2js-preprocessor'',
''karma-jasmine'',
''karma-safari-launcher'',
''karma-story-reporter''
],
También cambié mi sección de preprocessors
para que se vea así:
preprocessors: {
''**/*.html'': [''html2js'']
},
Y cambié mi beforeEach()
a lo siguiente:
beforeEach(function() {
var imagelist = __html__[''../karma/imagelist.fix.html''];
document.body.appendChild(imagelist);
});
Todavía veo el mismo TypeError: document.getElementById(...) is null
, sin embargo.