4

Railsアプリケーションでカピバラとキュウリの両方を使用しようとしています。だから、それは私がしたことです:

  • インストールされた宝石が必要であり、それらをに追加しましたGemfile
  • を実行しましたrails generate capybara:install --cucumber
  • きゅうりの機能とそのステップ定義を作成しました

これが私の機能です(ええ、私はブログアプリケーションを作成しています):

Feature: Browse posts
    So that I can browse through the posts
    As a visitor
    I want to see all and/or particular posts

    Scenario: Viewing all the posts
        Given Posts exist
        When I navigate to the website home
        Then I should see all the posts

    Scenario: Viewing particular post
        Given Post #1 exists
        When I navigate to /posts/view/1
        Then I should see the post with id=1

そして、これがそのステップ定義です:

Given /^Posts exist$/ do
    assert (not Post.all.empty?), "No posts found at all"
end

Given /^Post #(\d+) exists$) do |id|
    assert Post.find_by_id(id).valid?, "Post ##{ id } was not found at all"
end

When /^I navigate to (.+)$/ do |url|
    if url =~ /^the website home$/ then
        visit '/'
    else
        visit url
    end
end

Then /^I should see all(.+)posts$/ do |delimiter|
    posts = Post.all

    posts.each do |post|
        page.should have_content post.title
    end
end

Then /^I should see the post with id([^\d]{1,})(\d+)$/ do |delimiter, id|
    post = Post.find_by_id id

    page.should have_content post.title
end

そして、実行するとrake cucumber、次のメッセージが表示されます。

Then I should see all the posts     # features/step_definitions/browsing_posts.rb:13
  undefined method `should' for #<Capybara::Session> (NoMethodError)
  ./features/step_definitions/browsing_posts.rb:17:in `block (2 levels) in <top (required)>'
  ./features/step_definitions/browsing_posts.rb:16:in `each'
  ./features/step_definitions/browsing_posts.rb:16:in `/^I should see all(.+)posts$/'
  features/browsing_posts.feature:9:in `Then I should see all the posts'

私は何が間違っているのですか?そして、ええ、私の機能に何か間違いはありますか?

4

3 に答える 3

16

に置き換えpage.should have_content post.titleますassert page.has_content?(post.title)have_contentそれが機能する場合は、他のステートメントと同様に適用します

編集:これらのステートメントはshouldrspecの期待に基づいており、rspecまたはresponds_toを実行する他のテストフレームワークをすでに使用している場合にのみ使用する必要がありますshould。test :: unit angleから来ると、これはおそらく別の種類のですassert

于 2012-08-29T12:19:17.470 に答える
4

やってみませんか

page.has_content?('foo')

それ以外の

page.should have_content post.title

それが機能する場合は、これをassertで使用できます。

于 2012-08-29T12:23:29.597 に答える
2

同じ問題に直面した後、私は試しました

expect(page).to have_content('foo')

私にとってはうまくいきました

于 2013-09-01T06:12:52.537 に答える