assert_select匹配文本失败:为何查询.title返回0结果而非预期2?
问题原因分析
你的assert_select ".title", text: "Title".to_s, count: 2匹配失败,核心原因是:
- Rails的
assert_select中text参数默认是精确匹配,但.title元素的实际文本并非单纯的"Title",而是包含换行、缩进空格和前缀"Title:"的完整内容:Title: Title - 失败信息里也明确显示:预期文本是
<Title>,但实际是<Title:\n Title>,精确匹配不成立,所以返回0个匹配结果。
解决方案
针对这个问题,有几种可行的修复方式:
1. 使用模糊匹配(推荐)
给assert_select添加exact: false选项,允许文本包含目标内容即可,无需完全一致:
assert_select ".title", text: "Title".to_s, count: 2, exact: false
同样,其他几个断言也需要做相同调整,比如description:
assert_select ".description", text: "Description".to_s, count: 2, exact: false
2. 使用正则表达式匹配
用正则表达式匹配包含目标文本的内容,或者精确匹配完整文本格式:
# 匹配包含"Title"的文本 assert_select ".title", text: /Title/, count: 2 # 精确匹配带换行和空格的完整文本(适合严格校验格式) assert_select ".title", text: /\ATitle:\s+Title\z/, count: 2
3. 调整视图结构(更严谨)
把事件标题单独放在一个子元素中,让测试可以精确定位到纯标题文本:
修改_event.html.erb的.title段落:
<p class="title"> Title: <span class="event-title"><%= event.title %></span> </p>
然后测试时直接选择这个子元素:
assert_select ".event-title", text: "Title".to_s, count: 2
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

