假设您有一个仅包含以下选项的选择列表:
<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的行为,但没有谈到部分匹配文本本身的行为。 这里关于SO的其他问题指的是相同的记录行为......但不涉及反驳或选项文本的匹配。
虽然我可以使用
assert
options:
相反的行为,如下所示:
assert has_select?('select_id',
options: ['Second Fake Option'])
当您有很长的选择列表并想要反驳列表中某个特定选项的存在时,这可能会很痛苦。
如何正确地反驳选择列表中特定选项的存在?
部分文本匹配是默认行为,但可以使用 :exact 选项覆盖。另外,您应该调用
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)
您可以直接通过
反驳该选项的存在assert_no_selector("option[value='Fake Option']", visible: :all)
注意
visible: :all
如果选择的选项被隐藏,它仍然会匹配/拒绝匹配。