Rails 3でCucumber/Capybaraを使用しており、アップロード後に画像の存在を検証しようとしています。画像のURLを確認して検証する方法がわかりません。
次のシナリオがあります。
Scenario: Create new listing
Given I am on the new listing page
When I fill in "listing_name" with "Amy Johnson Photography"
And I attach the file "features/support/test_image.jpg" to "listing_images_attributes_0_photo"
And I press "Create"
Then I should see "Amy Johnson Photography"
And I should see the image "test_image.jpg"
最後のステップを除いてすべてが通過します。
ステップ定義でこれを試しました。これは、ページ上のテキストの場合はうまく機能しますが、画像のURLでは機能しません。
Then /^I should see the image "(.+)"$/ do |image|
if page.respond_to? :should
page.should have_content(image)
else
assert page.has_content?(image)
end
end
次に、代わりにこのステップ定義のようなものも試しました。
Then /^I should see the image "(.+)"$/ do |image|
html = Nokogiri::HTML(response.body)
tags = html.xpath('//img[@src="/public/images/foo.png"]')
# tags.length.should eql(num_of_images)
end
これにより、次のエラーが発生します。
And I should see the image "test_image.jpg" # features/step_definitions/listing_steps.rb:41
undefined method `body' for nil:NilClass (NoMethodError)
./features/step_definitions/listing_steps.rb:42:in `/^I should see the image "(.+)"$/'
features/manage_listings.feature:24:in `And I should see the image "test_image.jpg"'
これを正しく見つけるには、のこぎりのステップが必要だと思います。または、もっと良い方法があれば、私は提案を受け入れます。アップロードしたばかりの画像がページにあることを確認するにはどうすればよいですか?ありがとう。
Nokogiriを使用したソリューションは正常に機能するはずです。唯一の問題は、Cabybara APIがWebratとは異なるため、response.body
の代わりにpage.body
を使用する必要があることです。
しかし、Cabybaraで画像をテストするさらに良い方法があります:
Then /^I should see the image "(.+)"$/ do |image|
page.should have_xpath("//img[@src=\"/public/images/#{image}\"]")
end
こんにちは私はXPATHが苦手ですが、CSSを使えば試すことができます:
if page.respond_to? :should page.should have_selector( "img [src $ = '#{imagename}']") else assert page.has_selector?( "img [src $ = '#{imagename}'] ") end
願いが叶う! jramby
この方法でテストできますが、パスに依存しません。
Then /^I should see the image "(.+)"$/ do |image|
page.should have_xpath("//img[contains(@src, \"#{image}\")]")
end
page.should
現在は非推奨です。代わりに使用してください
expect(page).to
完全な例:
Then /^I should see the image "(.+)"$/ do |image|
expect(page).to have_xpath("//img[contains(@src, \"#{image}\")]")
end
これは機能しますか?
page.should have_xpath('//img[@src="/public/images/foo.png"]')
はい、しかしこれらのxpathテストは次の事実を扱いません...
/public/images/foo.jpg
public/images/foo.jpg
http://mydomain.com/public/images/foo.jpg
...画像へのすべて同じ有効なリンクです。
テストしたい画像がたくさんある場合は、has_imageを作成できますか?カピバラのマッチャー。
それは簡単で、この投稿はそれを段階的に説明しています: has_image?マッチャーをカピバラに追加する