Простой способ проверить вложенные модели формы с огурцом? - PullRequest
3 голосов
/ 26 апреля 2011

У меня есть вложенная модель для отделов в форме больницы.Фрагмент кода выглядит следующим образом:

    <%= 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 ]

7 голосов
/ 26 апреля 2011

У Капибары есть способ справиться с этим, используя внутри.Например:

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

Например, если у вас есть div с идентификаторами 'Hospital_Fields' и 'Department_fields' в обеих областях формы, вы можете сделать что-то вроде этого, чтобы определить, какое поле вы заполняете:

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

Вы также можете конкретизировать, используя идентификатор текстового поля вместо имени метки поля.Например, если первое текстовое поле имеет идентификатор «имя_больницы», а второе - «имя_больницы», вы можете сделать следующее:

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 голос
/ 27 апреля 2011

Кажется, Пан поможет вам найти ответ на ваш вопрос.

Однако я хотел бы добавить свои два цента здесь. Как было рекомендовано многими людьми, включая Дана Норта [1], Бена Маби [2], Йонаса Никласа [3] и даже Асласка Хеллесёя, рекомендовавшего вам удалить web_steps.rb [4], вы должны стараться не писать сценарии с огурцом. с подробностями реализации шагов.

When I fill in "Name" with "Cardiology"

Речь идет о заполнении ввода формы HTML на основе ее метки или идентификатора или чего-то еще ... Это реализация.

Я думаю, вы могли бы пойти с такими шагами, как:

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

Дэн Норт даже рекомендует иметь только одно «событие» [5] (шаг «Когда»):

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

Вся обработка формы / html затем инкапсулируется в одношаговое определение. И, конечно, там вы можете применить предложенное выше выражение панорамы XPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...