4

我正在尝试在我的 Rails 应用程序中同时使用 Capybara 和 Cucumber。所以,这就是我所做的:

  • 需要安装的 gem 并将它们添加到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.titleassert page.has_content?(post.title)。如果可行,请将其应用于其他have_content语句

编辑:那些涉及的语句should是基于rspec 期望的,只有当你已经在使用 rspec 或其他一些测试框架时才应该使用 responds_to should。从 test::unit 角度来看,这可能只是另一种assert.

于 2012-08-29T12:19:17.470 回答
4

你能试一下吗

page.has_content?('foo')

代替

page.should have_content post.title

如果它有效,那么你可以将它与断言一起使用。

于 2012-08-29T12:23:29.597 回答
2

在遇到同样的问题后,我尝试过

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

这对我来说很好

于 2013-09-01T06:12:52.537 回答