jasmine - JSCover con PhantomJS-TypeError: ''null'' no es un objeto
jscoverage (3)
Me enfrenté al mismo problema cuando intento ejecutar Jasmine con PhantomJS. Me di cuenta de que la última versión de Jasmine-html.js (jasmine-2.0.0-rc2) no coincide con PhantomJS''s run-jasmine.js (phantomjs-1.9.2-windows).
En la versión jasmine-2.0.0-rc2 de Jasmine-html.js, la clase ''.description'' no está disponible si pasaron todas las pruebas. Esta clase de "descripción" se crea solo si falla alguna prueba.
Por lo tanto, cuando ejecuto el phantomjs con todas las pruebas pasadas, aparece el mensaje de error anterior. Modifiqué run-jasmine.js para adaptarlo a Jasmine-html.js (jasmine-2.0.0-rc2) para resolver este problema.
Cuando trato de ejecutar JSCover con PhantomJS, veo a continuación ERROR:
Pasos seguidos:
1) Ejecute el servidor JSCover:
java -jar ~/JSCover/target/dist/JSCover-all.jar -ws --report-dir=report
2) Ejecute el corredor PhantomJS con JSCover: *phantomjs --debug=true ~/JSCover/src/test/javascript/lib/PhantomJS/run-jscover-jasmine.js
localhost8080/<app>/module/framework/test/SpecRunner.html
TypeError: ''null'' is not an object
(evaluando '''' document.body.querySelector (''. Description''). InnerText '') `
phantomjs://webpage.evaluate():3
phantomjs://webpage.evaluate():22
phantomjs://webpage.evaluate():22
2013-09-19T16:36:07 [DEBUG] WebPage - evaluateJavaScript result QVariant(, )
2013-09-19T16: 36: 07 [DEBUG] WebPage - evaluateJavaScript "(function () {return (function () {jscoverage_report (''phantom'');}) ();}) ()" 2013-09 -19T16: 36: 07 [DEBUG] WebPage - evalúe el resultado de Javava QVariant (,) 2013-09-19T16: 36: 07 [DEBUG] Red - Error de solicitud de recursos: 5 ("Operación cancelada") URL: localhost8080/<app_home>/lib/backbone/1.0.0/backbone.js?cb=0.5381254460662603
¿Estás cargando tus pruebas de forma asíncrona? Yo uso requirejs para javascript modular. También se usa para cargar las especificaciones de prueba:
<script data-main=''SpecRunner'' src=''/test/scripts/libs/require.js''></script>
Al utilizar JSCover, el script run-jscover-jasmine.js
no tiene en cuenta este comportamiento asincrónico, por lo que los nodos DOM a los que se hace referencia en la consulta no existen (todavía). Modifiqué la secuencia de comandos para retrasar el waitFor call por 1 segundo:
page.open(system.args[1], function(status){
if (status !== "success") {
console.log("Unable to access network");
phantom.exit();
} else {
// Added 1s delay here
window.setTimeout(function() {
waitFor(function(){
return page.evaluate(function(){
return document.body.querySelector(''.symbolSummary .pending'') === null
});
}, function(){
var exitCode = page.evaluate(function(){
console.log('''');
console.log(document.body.querySelector(''.description'').innerText);
var list = document.body.querySelectorAll(''.results > #details > .specDetail.failed'');
if (list && list.length > 0) {
console.log('''');
console.log(list.length + '' test(s) FAILED:'');
for (i = 0; i < list.length; ++i) {
var el = list[i],
desc = el.querySelector(''.description''),
msg = el.querySelector(''.resultMessage.fail'');
console.log('''');
console.log(desc.innerText);
console.log(msg.innerText);
console.log('''');
}
return 1;
} else {
console.log(document.body.querySelector(''.alert > .passingAlert.bar'').innerText);
return 0;
}
});
page.evaluate(function(){
jscoverage_report(''phantom'');
});
phantom.exit(exitCode);
});
}, 1000);
}
});
Dependiendo de la cantidad de código cargado, es posible que tenga que aumentar el retraso.
Este fue un problema con el que me encontré ayer. Resulta que el script de ejemplo no funciona para las versiones más nuevas, así que construí un nuevo script Phantom que funciona para Jasmine 2.X que lo corrige. Puede ubicar el script de trabajo aquí en mi repositorio: