Учтите, что у вас есть список выбора с помощью только следующей опции:
<option>Second Fake Option</option>
И вы хотели бы утверждать, что список выбора не содержит опции с текстом «Fake Option»:
<option>Fake Option</option>
Когда кто-то опровергает это так:
refute has_select?('list_id',
with_options: ['Fake Option'])
Тест не проходит. Кажется, что Capybara успешно частично сопоставляет текст Fake Option
с текстом Second Fake Option
. Более того, следующее:
refute has_select?('select_id',
with_options: [''])
Тем не менее следующие проходы:
refute has_select?('select_id',
with_options: ['BORK'])
Документация для with_options:
и options:
описывает поведение в отношении списка параметров, которые мы пытаемся сопоставить, но не говорит об этом поведении, которое частично соответствует самому тексту. Другие вопросы здесь, на SO, относятся к тому же документированному поведению ... но не адресуют опровержение или соответствие текста параметров.
Хотя я мог бы assert
противоположное поведение с options:
вот так:
assert has_select?('select_id',
options: ['Second Fake Option'])
Это может быть болью, когда у вас есть длинный список выбора и вы хотите опровергнуть наличие одного конкретного параметра в списке.
Как правильно опровергнуть наличие определенной опции в списке выбора?
Всего 1 ответ
Частичное согласование текста - это поведение по умолчанию, но его можно переопределить с помощью: точной опции. Кроме того, вместо опровержения предиката вы должны вызвать refute_select
- сообщения об ошибках будут намного лучше
refute_select('select_id', with_options: ['Fake Option'], exact: true)
Примечание: это также будет проходить, если на странице не было элемента select_id, который может быть не таким, каким вы хотите. Если вы хотите проверить, что выбор существует, но он не имеет определенной опции, тогда что-то вроде
select = find_field('select_id')
refute_selector(select, :option, 'Fake Option', exact: true)
может быть то, что вы хотите, что также можно было бы сделать со спичками как
select = find_select('select_id')
refute_matches_selector(select, :select, with_options['Fake Option'], exact: true)