2013-08-22 5 views
6

Ho uno repository che è integrato con travis. Ho dei test QUnit che mi piacerebbe eseguire da grunt/node server side e AMD (requirejs). Questa è la fonte dei miei Init.js AMD:grunt non esegue test QUnit su phantom

(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(); 
    }); 
}()); 

Quando eseguo questi test QUnit all'interno mio browser - tutto funziona perfettamente. Ma quando provo a eseguirli dal livello di grunt (lato server usando phantomjs), it fails. Ottengo:

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. 

tutto il tempo. Stavo cercando di fare evetyrhing stesso modo in cui è fatto in this tutorial, ma ancora ottengo risultati errati (phantom di essere impiccato, invece di servire i test QUnit) ...

+1

vedo il tuo Travis sta passando. Come hai risolto il problema? – Markus

risposta

1

è perché il bridge che viene iniettato nella pagina grugnito qunit è posto lì prima che qunit sia caricato da requirejs.

E deve essere dopo. Quindi probabilmente i tuoi test funzionano, ma qunit grunt non lo sa perché non riporta nulla.

Ho eseguito un test rapido inserendo il codice del bridge all'estremità nel modulo di estensione qunit e ha funzionato correttamente.

Probabilmente potresti creare un modulo di ponte qunit e chiamarlo anche nella tua qunit estesa o simile.

Il codice dal bridge ufficiale dovrebbe funzionare correttamente. Assicurati solo che venga recuperato dopo qunit.

Grunt qunit continuerà a iniettare lo script ma fallirà poiché QUnit non è definito, ma probabilmente non danneggerà i test.

+4

Quindi cosa si può fare per risolvere questo problema? – funkybro

2

Sto usando grunt-contrib-qunit per eseguire i test QUnit via grunt. Usa phantomjs internamente.

mi è stato sempre lo stesso errore, come l'OP dopo l'aggiornamento grugnito-contrib-qunit alla versione più recente (0.7.0):

PhantomJS timed out, possibly due to a missing QUnit start() call.

per risolvere questo problema, ho dovuto prima QUnit carico via require() e quindi eseguire QUnit.start() e definire tutti i miei moduli e test QUnit dopo.

Il file HTML simile a questa:

<!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> 

Poi il mytests.js del file:

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); 
    }); 
});