web-dev-qa-db-ja.com

キュウリ/カピバラがRails 3

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"'

これを正しく見つけるには、のこぎりのステップが必要だと思います。または、もっと良い方法があれば、私は提案を受け入れます。アップロードしたばかりの画像がページにあることを確認するにはどうすればよいですか?ありがとう。

23
Jamis Charles

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
39
ndbroadbent

こんにちは私はXPATHが苦手ですが、CSSを使えば試すことができます:

 if page.respond_to? :should 
 page.should have_selector( "img [src $ = '#{imagename}']")
 else 
 assert page.has_selector?( "img [src $ = '#{imagename}'] ")
 end 

願いが叶う! jramby

13
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
5
Noémien Kocher

これは機能しますか?

page.should have_xpath('//img[@src="/public/images/foo.png"]')
3
monocle

はい、しかしこれらのxpathテストは次の事実を扱いません...

/public/images/foo.jpg
public/images/foo.jpg
http://mydomain.com/public/images/foo.jpg

...画像へのすべて同じ有効なリンクです。

0
ac_

テストしたい画像がたくさんある場合は、has_imageを作成できますか?カピバラのマッチャー。

それは簡単で、この投稿はそれを段階的に説明しています: has_image?マッチャーをカピバラに追加する

0
Neil Hoff