testing - 你如何反驳 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 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'])
当您有一个很长的选择列表并且想要反驳列表中存在一个特定选项时,这可能会很痛苦。
如何正确反驳选择列表中特定选项的存在?
解决方案
部分文本匹配是默认行为,但可以使用 :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)
推荐阅读
- android - 尝试从片段布局中引用元素时,view.findViewById 返回 null
- angular - 关于 rxjs 可观察对象的基本问题——如何“手动”将数据提供给可观察对象?
- mysql - 日期时间格式无效:1292 日期时间值不正确 - 不合逻辑
- r - 如何比较R中的多个特定列
- javascript - 提交后角材料重置表格
- css - 是什么导致谷歌字体的样式无法通过在字体系列后添加样式名称来工作?
- node.js - 在 MongoDB 中存储数据的最佳方式
- python - 相对于全局位姿的相机位姿变化
- excel - Excel数组公式挑战
- javascript - 如何更改表格数据以响应模式中的按钮