Luché por un tiempo. Mi solución no está limpia, pero funciona, y estoy contento con eso debido a la documentación inacabada de api de phantomjs.
Explicación de Wordy
Necesita tres archivos. Uno es su archivo de prueba amd phantomjs que llamaré "amd.js". El segundo es cargar tu página html a la que llamaré "amd.html". Finalmente, la prueba del navegador que llamé "amdTestModule.js".
En amd.html, declare su etiqueta de script por la normalidad:
<script data-main="amdTestModule.js" src="require.js"></script>
En el archivo de prueba PhantomJS, aquí es donde se pone hacky. Crea tu página y cárgala en el módulo 'fs'. Esto le permite abrir una ruta de archivo relativa.
var page = require('webpage').create();
var fs = require('fs');
page.open('file://' + fs.absolute('tests/amd.html'));
Ahora ya que los archivos de forma asíncrona RequireJS cargas, no podemos pasar de una devolución de llamada en page.open y esperar que las cosas van bien. Necesitamos alguna forma de
1) Pruebe nuestro módulo en el navegador y comunique el resultado a nuestro contexto phantomjs. O
2) Indique a nuestro contexto phantomjs que al cargar todos los recursos, ejecutar una prueba.
# 1 era más simple para mi caso. Lo logré a través de:
page.onConsoleMessage = function(msg) {
msg = msg.split('=');
if (msg[1] === 'success') {
console.log('amd test successful');
} else {
console.log('amd test failed');
}
phantom.exit();
};
** Vea el código completo a continuación para mi mensaje console.log.
Ahora parece que phantomjs tiene una api de evento incorporada pero no está documentada. También pude obtener con éxito mensajes de solicitud/respuesta de su página.enResourceReceived y de la página.onResourceRequested: lo que significa que puede depurar cuando se cargan todos los módulos necesarios. Sin embargo, para comunicar el resultado de mi prueba, acabo de usar console.log.
Ahora, ¿qué ocurre si el mensaje console.log nunca se ejecuta? La única manera de que pudiera pensar en la solución de esta era utilizar setTimeout
setTimeout(function() {
console.log('amd test failed - timeout');
phantom.exit();
}, 500);
Eso debería hacerlo!
Código completo
estructura de directorios
/projectRoot
/tests
- amd.js
- amdTestModule.js
- amd.html
- require.js (which I symlinked)
- <dependencies> (also symlinked)
amd.js
'use strict';
var page = require('webpage').create();
var fs = require('fs');
/*
page.onResourceRequested = function(req) {
console.log('\n');
console.log('REQUEST');
console.log(JSON.stringify(req, null, 4));
console.log('\n');
};
page.onResourceReceived = function(response) {
console.log('\n');
console.log('RESPONSE');
console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response, null, 4));
console.log('\n');
};
*/
page.onConsoleMessage = function(msg) {
msg = msg.split('=');
if (msg[1] === 'success') {
console.log('amd test successful');
} else {
console.log('amd test failed');
}
phantom.exit();
};
page.open('file://' + fs.absolute('tests/amd.html'));
setTimeout(function() {
console.log('amd test failed - timeout');
phantom.exit();
}, 500);
amd.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script data-main='amdTestModule.js' src='require.js'></script>
</body>
</html>
amdTestModule.js
require([<dependencies>], function(<dependencies>) {
...
console.log(
(<test>) ? "test=success" : "test=failed"
);
});
consola
$ phantomjs tests/amd.js
amd test successful
¿Alguna vez resolver esto? –
Llegué un poco más lejos ... puede obtener acceso a las necesidades reales para requerir una variable como esta: require = null; phantom.injectJs ('target/dependencies/requirejs-tar.gz/require.js'); –
@Thomas, voy a intentarlo, :) – user1395927