1

所以我正在用Cucumber做 BDD,并有一个从数据库填充复选框的表单。复选框的标签包含超链接。到目前为止,还不算太奇特(注意,这是HAML而不是 Erb,但它应该对任何 Rails 人来说都足够可读):

I would like my donation to support:
%br
- for podcast in @podcasts
  = check_box_tag "donation[podcast_ids][]", podcast.id, true
  = donation.label "donation[podcast_ids][]", link_to(podcast.name, podcast.url), :value => podcast.id
  %br

问题是在我的 Cucumber 功能中,我不知道如何找到该复选框来检查它。故事的相关部分是这样的:

  Scenario: Happy path
    Given I am on the home page
    When I fill in "My email address" with "john@example.org"
     # Skipped for brevity...
     And I check the "Escape Pod" podcast
     And I check the "PodCastle" podcast
     And I press "I'm ready!"
    Then I should see "Thank you!"
     And there should be 2 podcast donation records

如果我使用的是裸webrat_steps.rb文件,我会收到以下错误:

Could not find field: "Escape Pod" (Webrat::NotFoundError)

我很确定这是因为这种link_to()方法,我用它来使“Escape Pod”成为指向实际网站的超链接。但是我无法link_to从我的 Cucumber 步骤轻松访问,而且我无法找出任何合理的方式将 Webrat 指向正确的复选框,除非在我的步骤中拼凑一大堆超链接代码(这使得它非常脆弱)。

我的 BDD 在这一点上停滞不前。我不想仅仅因为它很难测试就删除链接。而且感觉应该不难测试。Webrat 只是限制了我可以传递给该checks()方法的内容。谁能为此提出一个优雅的答案?

4

2 回答 2

2

简短的回答是使用 field_by_xpath 或其他 Webrat::Locators 方法之一来选择在您的步骤中操作的元素:

When(/^I check the "(.+?)" podcast$/) do |name|
  check(field_by_xpath("//label/a[.=#{name}]")
end

您可能需要稍微使用一下该 xpath,或者field_by_id改用它。请记住,它正在寻找标签的 html id,而不是数据库中的 id。

于 2009-09-25T00:43:00.483 回答
0

您可以在有问题的复选框附近的呈现页面中发布您的 HTML 的样子吗?有时您必须尝试命名该字段......我在登录表单方面遇到了各种各样的麻烦......我最终这样做了:

<%= submit_tag 'Enter', {:id => "login_button"} %>

所以以下工作:

Given /^I am logged in as admin$/ do
    visit login_path
    fill_in "login", :with => "admin"
    fill_in "password", :with => "password"
#    click_button "login_button"
    click_button
end

我知道这不是一个复选框的例子,但也许摆弄你的名字/身份证/等会起作用

于 2010-08-08T17:32:14.433 回答