Sono abbastanza certo che il problema è che i collegamenti jquery impostati per l'esecuzione su $ (document) .ready non hanno a disposizione l'html della fixture. Quindi, quando si verificano i miei eventi che intendono apportare una modifica al DOM tramite una funzione jQuery, non accade nulla e i miei test falliscono. Ho visto una "soluzione" a questo problema, here, ma quella soluzione che ha funzionato per me, richiedeva di cambiare la mia funzione jquery di lavoro per legare con il metodo .live invece del metodo .click. Ho due problemi con questo. Per prima cosa non voglio dover cambiare il mio codice di lavoro in modo che i test passino correttamente. Il framework di test dovrebbe testare se il codice funzionerà nell'app, dove il caricamento del DOM e le associazioni javascript si verificano nell'ordine corretto. Il secondo problema che ho con la soluzione è che .on e .delegate entrambi non hanno funzionato per qualche motivo e l'unica cosa che ha finito per funzionare era usare il metodo .live che è attualmente in fase di deprecazione. In conclusione, vorrei capire come modificare i miei test o il framework di testing stesso, in modo tale che le fixture siano caricate prima delle funzioni eseguite in $ (document) .ready.Come posso caricare i miei dispositivi di prova del gelsomino prima che javascript consideri il documento "pronto"?
Sto lavorando con i binari 3.2.8 e ho impostato due rami diversi per sperimentare il test del gelsomino. Uno dei rami utilizza la gemma di jasminerice e l'altro utilizza la gemma dei gelsomini. Javascript e jQuery (quando si utilizza il metodo .live) sottopongono tutti i test correttamente a entrambi i set-up.
Ecco una descrizione del ramo utilizzando riso jasmine:
Ecco le linee dal mio file Gemfile.lock che descrivono il gelsomino e jQuery set-up:
jasminerice (0.0.9)
coffee-rails
haml
jquery-rails (2.1.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
riso jasmine include l'estensione da jasmine-jquery predefinito. L'estensione jasmine-jQuery fornisce il metodo toHaveText che sto usando nei test.
I jasmine_jquery_test.js file di prova che è situato direttamente all'interno della directory di spec/javascript contiene questo contenuto:
#= require application
describe ("my basic jasmine jquery test", function(){
beforeEach(function(){
$('<a id="test_link" href="somewhere.html">My test link</a>').appendTo('body');
});
afterEach(function(){
$('a#test_link').remove();
});
it ("does some basic jQuery thing", function() {
$('a#test_link').click();
expect($("a#test_link")).toHaveText('My test link is now longer');
});
it ("does some the same basic jQuery thing with a different trigger type", function() {
$('a#test_link').trigger('click');
expect($("a#test_link")).toHaveText('My test link is now longer');
});
});
describe ('subtraction', function(){
var a = 1;
var b = 2;
it("returns the correct answer", function(){
expect(subtraction(a,b)).toBe(-1);
});
});
miei tests.js file JavaScript che si trova nella cartella app/attività/javascript dir ha questa contenuti:
function subtraction(a,b){
return a - b;
}
jQuery (function($) {
/*
The function I would rather use -
$("a#test_link").click(changeTheTextOfTheLink)
function changeTheTextOfTheLink(e) {
e.preventDefault()
$("a#test_link").append(' is now longer');
}
*/
$("a#test_link").live('click', function(e) {
e.preventDefault();
$("a#test_link").append(' is now longer');
});
});
il mio file application.js si trova nella stessa app/attività/javascript dir ha questo contenuto:
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree .
E la descrizione del ramo rotaie di gelsomini è disponibile nel contenuto del mio first jasmine test related stackoverflow question.
Quindi, se qualcuno ha un'idea su come manipolare i test in modo tale che le funzioni $ (document) .ready vengano eseguite dopo il caricamento dei dispositivi, mi piacerebbe molto sentire i vostri pensieri?
Come indicato nella documentazione [jasmine-jquery] (https://github.com/velesin/jasmine-jquery) 'Per impostazione predefinita, le fixture vengono caricate da spec/javascripts/fixtures. È possibile configurare questo percorso: jasmine.getFixtures(). FixturesPath = 'my/new/path'; ' – RamRovi
è ancora la soluzione migliore? a questo punto, questo è fastidioso perché ora ogni volta che cambi codice di produzione devi copiarlo sul dispositivo! – james