Капибара не соответствует переключателям в тесте rspec - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь написать тест для формы Bootstrap, используя rspec.У меня есть следующий код:

<div id="published" class="col-sm-auto">
  <div class="custom-control custom-radio custom-control-inline">
    <%= form.radio_button :published, true, checked: page.published?, class: 'custom-control-input' %>
    <%= form.label :published, 'Published', value: true, class: 'custom-control-label' %>
  </div>
  <div class="custom-control custom-radio custom-control-inline">
    <%= form.radio_button :published, false, checked: !page.published?, class: 'custom-control-input' %>
    <%= form.label :published, 'Hidden', value: false, class: 'custom-control-label' %>
  </div>
</div>

, который генерирует следующий HTML-код:

<div id="published" class="col-sm-auto">
  <div class="custom-control custom-radio custom-control-inline">
    <input class="custom-control-input" type="radio" value="true" name="page[published]" id="page_published_true" />
    <label class="custom-control-label" for="page_published_true">Published</label>
  </div>
  <div class="custom-control custom-radio custom-control-inline">
    <input class="custom-control-input" type="radio" value="false" checked="checked" name="page[published]" id="page_published_false" />
    <label class="custom-control-label" for="page_published_false">Hidden</label>
  </div>
</div>

Когда я запускаю этот тест, он завершается с сообщением

it 'should default to unpublished' do
  expect(page).to have_checked_field('Hidden')
end

выдача сообщения expected to find visible field "page[published]" that is checked and not disabled but there were no matches. Also found "", "", which matched the selector but not all filters.

Глядя на HTML в инспекторе, поле видно и не отключено, и есть метка, соответствующая тексту.Я понятия не имею, о чем эти две пустые строки.

Пожалуйста, кто-нибудь может сказать мне, почему have_checked_field не соответствует?Я действительно не заинтересован в написании более хрупкого теста, который использует has_css или has_xpath для поиска входного тега с определенным идентификатором - суть в том, что пользователь должен увидеть поле с надписью «Hidden», и оно должнобыть проверенным, независимо от того, что происходит за кулисами!

1 Ответ

0 голосов
/ 29 мая 2018

Я на 99,9% гарантирую, что радиовход фактически не виден и был заменен изображением с использованием CSS (и, возможно, немного JS).Вы можете сделать

expect(page).to have_checked_field('Hidden', visible: false)

или сделать что-то немного более сложное, чтобы убедиться, что метка действительно видна, как

expect(page).to have_css('input:checked + label', exact_text: 'Hidden')

Другое решение, если вы имеете дело с большим количеством этих радиоКнопками является написать пользовательский тип селектора, например,

Capybara.add_selector(:bootstrap_radio) do 
  xpath do |locator|
    XPath.descendant(:input)[XPath.attr(:type) == 'radio'].following_sibling(:label)[XPath.string.n.is(locator)]
  end

  filter(:checked) do |node, value|
    node.sibling('input[type="radio"]', visible: :hidden).checked? == value
  end
end

, который затем позволит вам сделать

expect(page).to have_selector(:bootstrap_radio, 'Hidden', checked: true)

, а затем вы сможете написать вспомогательные методы, такие как have_checked_bootstrap_radio, если хотите.Примечание: этот код был не в порядке, так что выражения XPath / CSS могут быть не на 100% правильными, но общая идея обоснована:)

...