首页 > 解决方案 > 你如何反驳 Capybara 的 has_select 选项的存在?

问题描述

假设您有一个仅包含以下选项的选择列表:

<option>Second Fake Option</option>

并且您想断言选择列表不包含带有文本“Fake Option”的选项:

<option>Fake Option</option>

当有人这样反驳时:

refute has_select?('list_id',
  with_options: ['Fake Option'])

测试失败。Capybara 似乎成功地将text与 text部分匹配。更进一步,以下内容也失败了: Fake OptionSecond 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'])

当您有一个很长的选择列表并且想要反驳列表中存在一个特定选项时,这可能会很痛苦。

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

标签: testingcapybara

解决方案


部分文本匹配是默认行为,但可以使用 :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)

推荐阅读