Ich bin mir ziemlich sicher, dass das Problem ist, dass die jquery Bindings, die auf $ (document) ready gesetzt sind, nicht die Fixture html zur Verfügung haben. Wenn also Ereignisse auftreten, die eine Änderung des DOM über eine jquery-Funktion bewirken sollen, passiert nichts und meine Tests schlagen fehl. Ich sah eine "Lösung" für dieses Problem here, aber diese Lösung, die für mich funktionierte, erfordert Änderung meiner Arbeit jquery Funktion mit der .live-Methode anstelle der .click-Methode zu binden. Ich habe zwei Probleme damit. Zuerst möchte ich meinen Arbeitscode nicht ändern müssen, damit die Tests ordnungsgemäß verlaufen. Das Test-Framework sollte testen, ob der Code in der App funktioniert, wo die DOM-Last und die JavaScript-Bindungen in der richtigen Reihenfolge auftreten. Das zweite Problem, das ich mit der Lösung habe, ist, dass .on und .delegate beide aus irgendeinem Grund nicht funktionierten und das einzige, was am Ende funktionierte, war, die .live-Methode zu verwenden, die gerade veraltet ist. Zusammenfassend möchte ich herausfinden, wie man entweder meine Tests oder das Testframework selbst ändert, so dass die Fixtures vor den Funktionen geladen werden, die in $ (document) .ready laufen.Wie kann ich meine Jasmin-Testgeräte laden, bevor das Javascript das Dokument als "bereit" betrachtet?
Ich arbeite mit Schienen 3.2.8 und ich habe zwei verschiedene Zweige eingerichtet, um mit Jasmin-Test zu experimentieren. Einer der Zweige verwendet das Jasminerice-Juwel und das andere verwendet den Jasmin-Rails-Edelstein. Das Javascript und jQuery (wenn die .live-Methode verwendet wird) Tests alle ordnungsgemäß in diesen beiden Setups übergeben.
Hier ist eine Beschreibung der Branche mit Reis # Siam-Reis:
Hier sind die Linien von meiner Gemfile.lock Datei Set-up der Jasmin und jQuery beschreiben:
jasminerice (0.0.9)
coffee-rails
haml
jquery-rails (2.1.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
Reis # Siam-Reis umfasst die jasmine-jquery Erweiterung durch Standard. Die Jasmine-jQuery-Erweiterung stellt die ToHaveText-Methode bereit, die ich in den Tests verwende.
die Testdatei jasmine_jquery_test.js, die direkt in dem spec/Javascripts Verzeichnis befinden enthält diesen Inhalt:
#= 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);
});
});
Meine Javascript-Datei tests.js, die in der App/assets/Javascripts dir befinden hat diese Inhalt:
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');
});
});
Meine application.js Datei im gleichen app/assets/Javascripts dir befindet hat folgenden Inhalt:
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree .
Und die Beschreibung der Jasmin-Schienen-Filiale finden Sie im Inhalt meiner first jasmine test related stackoverflow question.
Also wenn jemand eine Idee hat, wie man die Tests manipuliert, so dass die $ (Dokument) .ready Funktionen ausgeführt werden, nachdem die Fixtures geladen sind, würde ich sehr gerne Ihre Gedanken hören?
Wie in der Dokumentation [jasmine-jquery] (https://github.com/velesin/jasmine-jquery) vermerkt 'Standardmäßig werden Fixtures von spec/javascripts/fixtures geladen. Sie können diesen Pfad konfigurieren: jasmine.getFixtures(). FixturesPath = 'my/new/path'; ' – RamRovi
ist dies immer noch die beste Lösung? Auf Ihren Punkt, das ist ärgerlich, denn jedes Mal, wenn Sie den Produktionscode ändern, müssen Sie ihn in das Gerät kopieren! – james