Поля тестирования, динамически добавляемые коконом с использованием rspec и capybara

Мне было интересно, тестирует ли кто-нибудь поля, динамически добавляемые коконом?

Это здорово экономит время, но все поля, которые добавляются динамически, имеют очень длинные числа, добавленные к идентификатору и имени. Это означает, что я должен пропустить тестирование, для которого требуется более одного (набора) полей на странице.


person DazBaldwin    schedule 20.04.2014    source источник
comment
Вопрос не совсем ясен: вы хотите проверить наличие полей? Вы хотите установить поля?   -  person nathanvda    schedule 21.04.2014
comment
Эй, Натан, спасибо за драгоценный камень! Я просто изо всех сил пытался найти что-либо, сгенерированное им динамически, из-за длинных чисел, которые прикрепляются к указанным элементам. Например, щелчок по полям добавления выдает что-то вроде <input class="string required form-control" id="foo_foo_attributes_1398082250289_name" name="foo[foo_attributes_attributes][1398082250289][name]" type="text"> при обновлении, они устанавливаются в свой индекс в объекте ActiveRecord, но было неясно, как найти элемент, который был добавлен на лету.   -  person DazBaldwin    schedule 21.04.2014
comment
Обычно я использую счетчик, я считаю, чтобы увидеть, был ли добавлен (или удален) новый ребенок, и с помощью селекторов css вы можете легко найти вторую (n-ю) ассоциацию.   -  person nathanvda    schedule 22.04.2014
comment
из любопытства, чему соответствуют цифры?   -  person DazBaldwin    schedule 22.04.2014
comment
Извините, я не понимаю этого вопроса?   -  person nathanvda    schedule 22.04.2014
comment
в комментарии выше, что означает длинная числовая строка (1398082250289)? Откуда это взялось? Как он генерируется?   -  person DazBaldwin    schedule 22.04.2014
comment
Это просто идентификатор, чтобы убедиться, что он получает уникальный идентификатор. Это то же самое, что делают рельсы. И это не должно быть перепутано с существующим идентификатором.   -  person nathanvda    schedule 23.04.2014


Ответы (4)


Возможно, используя искатели Capybara сначала и селектор ввода. Что-то вроде этого:

visit new_resource_path
click_link "Add a Nested Resource"
first("input[name='nested_resource[name]']").set("Nested Resource")
click_button "submit"

Or

visit new_resource_path
click_link "Add a Nested Resource"
click_link "Add a Nested resource"
all("input[name='nested_resource[name]']").each do |input|
  input.set("Nested Resource")
end
click_button "submit

Это только подход, я никогда не работал с коконом. Однако это форма для проверки динамических входных данных.

person Armando    schedule 20.04.2014
comment
Спасибо за это, я действительно сталкивался с искателями в прошлом, но не видел, чтобы они использовались в контексте. Кроме того, стоит сказать, что при использовании webkit может потребоваться добавить небольшой sleep, чтобы позволить JS загружать элементы перед их поиском. - person DazBaldwin; 21.04.2014

Афаик, вы можете проверить две вещи:

  • что динамическое добавление вложенных элементов работает
  • создание элементов, их заполнение и хранение в базе данных

Итак, предположим, что соответствующая часть вашего представления выглядит так (пример по умолчанию):

#tasks
  = f.semantic_fields_for :tasks do |task|
    = render 'task_fields', :f => task
  .links
    = link_to_add_association 'add task', f, :tasks

и ваш вложенный элемент выглядит

.nested-fields
  = f.input :description
  = f.input :done, :as => :boolean
  = link_to_remove_association "remove task", f 

Так что обычно вы даете ему класс, я обычно просто проверяю количество элементов на странице.

Поэтому, если один элемент уже существует, создавая новый элемент, счет должен быть равен двум. Это вы можете проверить с помощью

 find("#tasks .nested-fields").count.should == 2

Заполняя вновь добавленный вложенный элемент, вы можете использовать селектор :last-child css

 find("#tasks .nested-fields:last-child input#description").set("something")

То, как формируются имена и идентификаторы, близко к внутренностям рельсов, поэтому я стараюсь держаться подальше от них.

person nathanvda    schedule 21.04.2014
comment
Еще раз спасибо, Натан, это, несомненно, поможет мне много раз в будущем - person DazBaldwin; 23.04.2014
comment
В вашем ответе говорится о :last, но используется :last-child. В моем случае :last работало, а :last-child нет. - person Andrew Grimm; 01.03.2016
comment
Странно: last-child — правильный селектор css, а imho: last не существует? Какой драйвер вы используете? - person nathanvda; 01.03.2016
comment
@nathanvda Я использовал Google Chrome. - person Andrew Grimm; 01.03.2016
comment
Ах, может быть, то, что допустимо в операторе JQuery в консоли JavaScript, недопустимо для вызова find в Capybara. Но меня все еще смущает то, что вы используете :last в тексте и :last-child в коде. - person Andrew Grimm; 01.03.2016
comment
Да, это была опечатка (которую я исправил). Capybara find по умолчанию использует css-селекторы или xpath. Jquery также должен поддерживать :last-child, но он также поддерживает :last (которого нет в css)(doc ) - person nathanvda; 01.03.2016

Возможная альтернатива, которую я только что использовал, — это динамическое обновление метки каждого добавленного поля формы (используя метод, упомянутый в https://github.com/nathanvda/cocoon/issues/374), и теперь мои тесты Cucumber/Capybara могут легко вставлять текст в различные поля нескольких форм, различая их по различным меткам, которые они имеют.

Полная информация о том, что я сделал в этом PR https://github.com/AgileVentures/WebsiteOne/pull/1818

person Sam Joseph    schedule 22.09.2017

Странный.

у меня есть в форме (haml):

= link_to_add_association f, :staff_phases, class: :button, id: 'add-staff-phase-link' do
  %i.fas.fa-plus

и в моем тесте

click_link 'add-staff-phase-link'
save_and_open_page

click_link работает, но я не вижу дополнительной ассоциации. если я, то на открывшейся странице кликнуть мышкой по ссылке, кокон-ссылка сработает и добавит ассоциацию

person chmich    schedule 17.07.2021