Railsアプリ内で、ページに画像(image_submit_tag)があり、選択するとサーバーにajaxリクエストが送信されます。サーバーはリクエストを受け取り、正しいことを行い、正しい JavaScript で応答します。正しい JavaScript は、ある画像を別の画像に置き換えます。これらはすべて、cucumber/capybara/webkit 環境の外で機能します。いわば人間用。
@javascript でタグ付けされた webkit (capybara-webkit 1.0.0) を使用して、cucumber(1.3.9)/capybara (2.1.0) で rails(3.2.9) アプリの単一のテスト (機能) と同じように実行すると、異なる結果。
テスト環境内で、応答 JavaScript が Webkit によって評価されません。代わりに、ページ上の新しいアイコンを見つけようとする後続のステップ内で、page.html をダンプすると、報告されるのは JavaScript 応答だけです。つまり、ページには返された JavaScript のみが含まれます。
これが新しいコンテンツを表示できるはずのステップです(jsエラーの可能性を排除するために応答javascriptを単純化したため、上記の説明とは異なります)。
Then(/^the "(.*?)" icon should be displayed$/) do |icon|
puts "------------------icon display on page------------------"
puts page.html
puts "________________________________________________________"
puts "************* icon displayed response headers ***"
put page.response_headers.inspect
puts "*************************************************"
page.should have_content("some text")
end
上記で page.html の出力について説明しましたが、応答ヘッダーがパズルに追加されます。何らかの理由で、webkit (?) は応答に問題があると考えています。
bad URI(is not URI?): {"Content-Type"=>"text/javascript; charset=utf-8",
"X-Ua-Compatible"=>"IE=Edge,chrome=1",
"Etag"=>"\"e7d3ccc2c53dd8e31d6f92d7dbb69dc0\"",
"Cache-Control"=>"max-age=0, private, must-revalidate",
"X-Request-Id"=>"776cf759cc343884091b5daec6a18587",
"X-Runtime"=>"0.048413",
"Server"=>"WEBrick/1.3.1 (Ruby/1.9.3/2013-02-22)",
"Date"=>"Fri, 08 Nov 2013 03:07:43 GMT",
"Content-Length"=>"47", "Connection"=>"Keep-Alive"}
(URI::InvalidURIError)
最後に、これが Rails によって返される実際の JavaScript です。
$('#go_on_duty').parent().html("some text");
回答を探し回ると、いくつかの質問が予想
されます。 1. はい、Capybara.javascript_driver = :webkit を設定しました。
2. はい、この機能は @javascript としてタグ付けされています
では、javascript が評価されない理由を知っている人はいますか? 明らかな何かを見逃しているのではないかとこっそり疑っていますが、目が疲れてきました。
関連するメモとして、リクエストの Accept ヘッダーを javascript に明示的に設定したため、ここまでしかできませんでした。私はこれを行うことができました私はウェブキットを使用しています(以下のように)
page.driver.header 'Accept', 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript'
上記の行を追加する前は、リクエストが「HTML として」サーバーに届いていたため、partial.js.erb がレンダリングされることさえありませんでした。当分の間、上記の回避策を喜んで受け入れますが、「単純なカピバラ/レール/キュウリの設定の問題を見落としています」のように、問題が関連していると思わざるを得ません。繰り返しますが、これはテスト環境のみの問題です。インタラクションは、人間主導の場合に期待どおりに機能します。
アップデート:
ご要望にお応えして、image_submit_tag を生成するパーシャルを以下に示します。
<%= form_tag(shifts_start_shift_path, :method => :post , :remote => true) do %>
<%=image_submit_tag("go_on_duty_sign.png", :size=> "35x35",
:id => "go_on_duty",
:title=>"Go On Duty") %>
<% end %>
関連するコントローラからのアクション コードは次のとおりです。
def start_shift
@shift = current_staff.current_shift
if !current_staff.on_duty?
@task_assignments = TaskAssignment.where(:shift_id => @shift.id)
respond_to do |format|
format.js
end
end
end
そして、応答をレンダリングするために使用される start_shift.js.erb テンプレートからの js 単一行 (上記から再現され、明らかに最小化されたもの) は次のとおりです。
$('#go_on_duty').parent().html("some text");
これが問題を解決するのに役立つことを願っていますが、人間が主導する場合、これはすべて機能することを再度強調します。テスト環境でのみ問題が発生します。ありがとう...
環境:
gem 'rails', '3.2.9'
group :test do
gem 'cucumber-rails', '1.4.0'
gem 'rspec-rails', '2.7.0'
gem 'database_cleaner', '0.7.0'
gem 'factory_girl', '2.3.2'
gem 'capybara-webkit', '1.0.0'
end