Po prostu walczyłem przez jakiś czas. Moje rozwiązanie nie jest czyste, ale działa, i cieszę się z tego z powodu niedokończonej dokumentacji api z phantomjs.
Uporczywe wyjaśnienie
Potrzebujesz trzech plików. Jednym z nich jest plik testowy amd phantomjs, który nazwałbym "amd.js". Druga strona to ładowanie strony html, którą nazwałbym "amd.html". Na koniec test przeglądarki, który nazwałem "amdTestModule.js".
W amd.html oświadczyć tag skryptu za normalne:
<script data-main="amdTestModule.js" src="require.js"></script>
W pliku testowego phantomjs, to jest, gdy robi się hacky. Utwórz swoją stronę i załaduj do modułu "fs". Pozwala to otworzyć względną ścieżkę pliku.
var page = require('webpage').create();
var fs = require('fs');
page.open('file://' + fs.absolute('tests/amd.html'));
Teraz od requirejs ładuje pliki asynchronicznie, nie możemy po prostu przejść w zwrotnego do page.open i oczekują rzeczy pójść gładko. Potrzebujemy jakiegoś sposobu na:
1) Przetestuj nasz moduł w przeglądarce i przekaż wynik do naszego kontekstu phantomjs. Lub
2) Poinformuj nasz kontekst phantomjs, że po załadowaniu wszystkich zasobów, aby uruchomić test.
# 1 był prostszy w moim przypadku. I dokonał tego poprzez:
page.onConsoleMessage = function(msg) {
msg = msg.split('=');
if (msg[1] === 'success') {
console.log('amd test successful');
} else {
console.log('amd test failed');
}
phantom.exit();
};
** Zobacz pełny kod poniżej dla mojego console.log wiadomości.
Teraz phantomjs ma wbudowane zdarzenie api, ale jest nieudokumentowane. Z powodzeniem udało mi się uzyskać komunikaty żądania/odpowiedzi z ich strony.onResourceReceived i strony.onResourceRequested - co oznacza, że możesz debugować po załadowaniu wszystkich wymaganych modułów. Aby jednak zakomunikować wynik testu, użyłem konsoli console.log.
Co się stanie, jeśli komunikat console.log nigdy nie zostanie uruchomiony? Jedynym sposobem, jaki mogłem wymyślić, aby rozwiązać ten problem, było użycie setTimeout
To powinno wystarczyć!
pełny kod
struktura katalogów
/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"
);
});
konsola
$ phantomjs tests/amd.js
amd test successful
Czy kiedykolwiek to zorientować się? –
Dostałem trochę dalej ... możesz uzyskać dostęp do rzeczywistego wymagającego wymagają zmiennej: require = null; phantom.injectJs ("target/dependencies/requirejs-tar.gz/require.js"); –
@ Thomas, spróbuję twojej drogi, :) – user1395927