Ho fatto qualcosa di simile con javascript validation , non execution .
Uso lo strumento da riga di comando gjslint di Google per convalidare javascript.
/**
*
* @test
* @dataProvider dataprovider_javascript_file
*/
public function javascript_files_are_valid ($fn){
$dn = getcwd();
$fn = "$dn/$fn";
// most of these are whitespace- file-ending- and missing-semicolon flags
$cmd1 = "gjslint --disable 131,1,2,5,10,11,300,-2 --nojsdoc --max_line_length 12000";
$cmd .= "$cmd1 $fn";
$flag = 1;
$act_string = system($cmd, $flag);
$exp_string = "1 files checked, no errors found.";
$this->assertEquals($exp_string, $act_string, print_r("cmd: $cmd", 1));
}
public function dataprovider_javascript_file() {
$dt->confArray = array("dirname1" => "", "dirname2" => "");
$files = array_filter($dt->confArray, "self::getfilenames2");
$files = array_map("self::val2array", $files);
return $files;
}
private function val2array($v){
return array($v);
}
private function getfilenames2($var){
//fetch js files, but not minified files
//return preg_match('/\.js$/', $var) ; #&& ! preg_match('/\.min\./', $var);
return preg_match('/\.js$/', $var) && ! preg_match('/\.min\./', $var);
}
Qui prendo l'output dal comando system () e controllo la stringa del messaggio. Questo è il metodo di un povero uomo, ma potrebbe essere sufficiente per iniziare.
Una strategia simile sarebbe quella di includere il browser headless phantomjs per davvero eseguire em> il tuo javascript. Quindi prendi la stringa di output e controlla che non contenga messaggi di errore.
Sono venuto qui per cercare delle risposte in cui qualcuno avrebbe potuto farlo, ma finora non ha trovato alcun codice. forse devo scriverlo da solo.
Modifica:
phantomjs-1.9.7-linux-x86_64/bin/phantomjs --web-security=false /phantomjs-1.9.7-linux-x86_64/examples/arguments.js test hello
Output:
0: /opt/smallapps/phantomjs-1.9.7-linux-x86_64/examples/arguments.js
1: test
2: a
Prendi questo output dalla riga di comando e controllalo con le asserzioni di phpunit.
example.js contiene:
var system = require('system');
if (system.args.length === 1) {
console.log('Try to pass some args when invoking this script!');
} else {
system.args.forEach(function (arg, i) {
console.log(i + ': ' + arg);
});
}
phantom.exit();
Purtroppo, tutto ciò funzionerà solo con i file javascript più semplici, senza alcuna dipendenza da framework come jQuery o interazioni reali con altri file javascript che devono essere incorporati in una pagina HTML reale, ad es. per accedere al DOM.