所以我正在使用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”成为实际网站的超链接。但我无法从我的Cucumber步骤轻松访问link_to
,我无法弄清楚任何合理的方式将Webrat指向右边的复选框,而不是克服一大堆超链接我的步骤中的代码(这使得它非常脆弱)。
我的BDD此时已停滞不前。我不想因为它很难测试而取出链接。感觉它不应该难以测试。 Webrat只是限制了我可以传递给checks()
方法的内容。有人能为此提出一个优雅的答案吗?
答案 0 :(得分: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。
答案 1 :(得分: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
我知道这不是一个复选框示例,但也许摆弄你的名字/ id /等会起作用