使用Cucumber测试嵌套模型表单的简便方法?

时间:2011-04-26 18:32:13

标签: ruby-on-rails cucumber nested-forms capybara

我在医院表格中有一个针对部门的嵌套模型。代码段如下所示:

    <%= f.simple_fields_for :hospital do |h| %>
    .
    .
    .       
       <%= h.simple_fields_for :departments do |builder| %>
              <%= render "department_fields", :f => builder %>
            <% end %>
.
.
    <% end %>

_department_fields部分看起来像这样:

<div class="fields">
    <%= f.input :name %>
    <%= link_to_remove_fields "remove", f %>
    </span>
</div>

因此,表单底部有一个位置供用户输入最多三个部门名称。

我正在使用Rails 3,Cucumber,Capybara和Selenium进行集成测试。

在Cucumber中测试此表单时,是否有一种简单的方法可以填写重复字段?

理想情况下,我希望能够像这样编写我的功能:

And I fill in the first "Name" with "Cardiology"
And I fill in the second "Name" with "Radiology"

有没有办法在Cucumber / Capybara轻松估算这个?有人已经找到了解决这个问题的一些步骤吗?

2 个答案:

答案 0 :(得分:7)

Capybara有办法通过使用内部来解决这个问题。例如:

And I fill in "Name" with "Radiology" within "fields"

例如,如果你在两个表单区域周围都有'hospital_fields'和'department_fields'的id,你可以这样做,以区分你正在填写的字段:

And I fill in "Name" with "Cardiology" within "hospital_fields"
And I fill in "Name" with "Radiology" within "department_fields"

您还可以使用文本字段ID而不是字段标签名称来更具体。例如,如果第一个文本字段的id为“hospital_name”,而第二个文本字段的id为“hospital_department_name”,则可以执行以下操作:

And I fill in "hospital_name" with "Cardiology"
And I fill in "hospital_deparment_name" with "Radiology"

更新:您还可以添加自定义黄瓜步骤以使用编号输入:

When /^(?:|I )fill in the (\d+)(?:st|nd|rd|th) "([^"]*)" with "([^"]*)"$/ do |num, name, value|
  find(:xpath, ".//form/input[@name='#{name}'][#{num}]").set(value)
end

And I fill in the 1st "name" with "Cardiology"
And I fill in the 2nd "name" with "Radiology"

更新:要与标签匹配,请使用以下表达式:

find(:xpath, ".//input[@id=//label[contains(.,'#{name}')]/@for][#{num}]").set(value)

答案 1 :(得分:1)

Pan似乎会帮助您找到问题的答案。

但是我想在这里加两分钱。正如许多人推荐的那样,包括Dan North [1],Ben Mabey [2],Jonas Nicklas [3]甚至AslaskHellesøy建议你删除web_steps.rb [4],你应该尽量不写黄瓜场景步骤显示实施细节。

When I fill in "Name" with "Cardiology"

这是关于根据标签或ID或其他方式填写HTML表单输入......这是实现。

我猜你可以采取以下措施:

When I create a department called "Cardiology"
And I create a department called "Radiology"

Dan North甚至建议只有一个“事件”[5](“当”步骤):

When I create departments called "Cardiology" and "Radiology"

然后将所有表单/ html处理封装在单个步骤定义中。当然,在那里你可以应用上面提到的XPath表达式。