请考虑您有一个选择列表,其中只有以下选项:
<option>Second Fake Option</option>
您要断言选择列表不包含带有文本“ Fake Option”的选项:
<option>Fake Option</option>
当有人这样反驳时:
refute has_select?('list_id',
with_options: ['Fake Option'])
测试失败。似乎水豚已经成功地部分将文本 Fake Option
与文本Second Fake Option
进行了匹配。更进一步,以下操作也会失败:
refute has_select?('select_id',
with_options: [''])
但以下通过:
refute has_select?('select_id',
with_options: ['BORK'])
with_options:
和options:
的文档描述了与我们要匹配的选项的 list 有关的行为,但并未说明部分匹配文字本身。 Other questions here on SO指的是相同的行为记录,但没有解决反驳或选项文本匹配的问题。
虽然我可以assert
options:
进行相反的操作,例如:
assert has_select?('select_id',
options: ['Second Fake Option'])
当选择列表较长且想反驳列表中存在某个特定选项时,这可能会很痛苦。
如何正确反驳选择列表中特定选项的存在?
答案 0 :(得分:1)
部分文本匹配是默认行为,但可以使用:exact选项覆盖。另外,您应该调用refute_select
而不是否定谓词-错误消息会好得多
refute_select('select_id', with_options: ['Fake Option'], exact: true)
注意:如果页面上没有'select_id'select元素(也可能不是您想要的),这也会通过。如果要验证选择是否存在,但没有特定选项,则类似
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)