$(document).readyで実行するように設定されたjqueryバインディングでは、フィクスチャhtmlを使用できないことが問題であると確信しています。したがって、jquery関数を介してDOMに変更を加えることを目的としたイベントが発生しても、何も起こらず、テストは失敗します。私はここでこの問題の「解決策」を見ました、しかし私のために働いたその解決策は、.clickメソッドの代わりに.liveメソッドでバインドするように私の動作中のjquery関数を変更する必要がありました。これには2つの問題があります。まず、テストが正しく合格するように、作業コードを変更する必要はありません。テストフレームワークは、コードがアプリで機能するかどうかをテストする必要があります。アプリでは、DOMの読み込みとJavaScriptのバインドが正しい順序で行われます。私が解決策で抱えている2番目の問題は、.onと.delegateの両方が何らかの理由で機能せず、機能することになった唯一のことは、現在非推奨になっている.liveメソッドを使用することでした。結論として、$(document).readyで実行される関数の前にフィクスチャがロードされるように、テストまたはテストフレームワーク自体を変更する方法を理解したいと思います。
私はRails3.2.8を使用しており、ジャスミンテストを実験するために2つの異なるブランチを設定しています。ブランチの1つはジャスミネリスの宝石を使用し、もう1つはジャスミンレールの宝石を使用します。JavascriptとjQuery(.liveメソッドを使用する場合)のテストはすべて、これらのセットアップの両方で適切に合格します。
jasminericeを使用したブランチの説明は次のとおりです。
ジャスミンとjQueryのセットアップを説明するGemfile.lockファイルの行は次のとおりです。
jasminerice (0.0.9)
coffee-rails
haml
jquery-rails (2.1.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
Jasminericeには、デフォルトでjasmine-jquery拡張機能が含まれています。jasmine-jQuery拡張機能は、テストで使用しているtoHaveTextメソッドを提供します。
spec / javascriptsディレクトリ内に直接あるテストファイルjasmine_jquery_test.jsには、次のコンテンツが含まれています。
#= 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);
});
});
app / Assets / javascriptsディレクトリにある私のjavascriptファイルtests.jsには、次の内容が含まれています。
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');
});
});
同じapp/Assets / javascriptsディレクトリにある私のapplication.jsファイルには、次の内容が含まれています。
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree .
そして、ジャスミンレールブランチの説明は、私の最初のジャスミンテスト関連のスタックオーバーフローの質問の内容にあります。
それで、フィクスチャがロードされた後に$(document).ready関数が実行されるようにテストを操作する方法を誰かが知っているなら、私はあなたの考えを聞きたいですか?