您如何反驳水豚的has_select选项的存在?

时间:2018-11-02 23:58:20

标签: testing capybara

请考虑您有一个选择列表,其中只有以下选项:

<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'])

当选择列表较长且想反驳列表中存在某个特定选项时,这可能会很痛苦。

如何正确反驳选择列表中特定选项的存在?

1 个答案:

答案 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)