J'ai un référentiel intégré aux travis. J'ai des tests QUnit que j'aimerais exécuter à partir du côté grunt / node server et AMD (requirejs). C'est la source de mon AMD init.js:
(function () { require.config({ baseUrl: "../src" }); require(["../test/suites/basic", '../test/qunit-extend', 'qunit' ], function(BasicTests) { QUnit.config.autoload = false; QUnit.config.autostart = false; BasicTests.run(); QUnit.load(); QUnit.start(); }); }());
Lorsque je cours ces tests QUnit dans mon navigateur, tout fonctionne parfaitement. Mais lorsque j'essaie de les exécuter à partir du niveau grunge (côté serveur en utilisant phantomjs), il échoue . Je reçois:
Running "qunit:all" (qunit) task Testing test/index.html Warning: PhantomJS timed out, possibly due to a missing QUnit start() call. Use --force to continue.
tout le temps. J'essayais de faire de la même façon que dans ce didacticiel , mais je reçois toujours des résultats erronés (le fantôme étant pendu au lieu de servir des tests QUnit) …
J'utilise grunt-contrib-qunit pour exécuter les tests QUnit par grunt. Il utilise phantomjs en interne.
J'avais la même erreur que l'OP après la mise à niveau de grunt-contrib-qunit à la dernière version (0.7.0):
PhantomJS timed out, possibly due to a missing QUnit start() call.
Pour corriger ce problème, j'ai d'abord chargé QUnit via require()
, puis exécuter QUnit.start()
et définir tous mes modules et tests QUnit après cela.
Le fichier HTML ressemble à ceci:
<!DOCTYPE html> <html> <head> <title>QUnit + RequireJS + PhantomJS</title> <link rel="stylesheet" href="lib/qunit/qunit/qunit.css"> </head> <body> <div id="qunit"></div> <div id="qunit-fixture"></div> <script src="lib/requirejs/require.js"></script> <script src="mytests.js"></script> </body> </html>
Ensuite, le fichier mytests.js
:
require.config({ paths: { 'qunit': 'lib/qunit/qunit/qunit' } }); require(['qunit'], function(QUnit) { QUnit.start(); QUnit.module('My Module'); QUnit.test('some normal test', function(assert) { assert.ok(true, 'can run a normal QUnit test'); }); QUnit.test('some asynchronous test', function(assert) { var done = assert.async(); setTimeout(function() { assert.ok(true, 'can run an asynchronous QUnit test'); done(); }, 50); }); });
C'est parce que le pont qui est injecté dans la page par grunt qunit est placé là avant qunit est chargé par requirejs.
Et il doit être après. Donc vos tests fonctionnent probablement, mais grin ce qunit ne le sait pas parce qu'il ne fait pas rapport.
J'ai fait un test rapide en plaçant le code du pont à la fin dans votre module d'extension qunit et cela a bien fonctionné.
Vous pourriez probablement créer un module qunit bridge et l'appeler aussi dans votre extension qunit ou similaire.
Le code du pont officiel devrait fonctionner correctement. Assurez-vous que vous l'obtenez après qunit.
Grunt qunit injectera encore le script, mais échouerait simplement puisque QUnit est indéfini, mais probablement ne nuira pas à vos tests.