Rspec视图测试用例执行失败:输入字段提交后内容未显示
排查RSpec测试失败的思路和解决方案
看起来你的测试是想验证提交配送标题后,列表页能正常显示这个标题,但目前执行失败了。咱们一步步拆解可能的问题:
1. 先确认表单是否真的提交成功
最常见的原因是表单验证未通过,导致页面停留在创建页,根本没跳转到列表页。你看错误信息里的页面内容,有一堆标注"必填"的字段(比如提取条件、主题、HTML正文等),但你的测试只填充了配送标题,其他必填项都是空的——这大概率会触发后端验证,导致表单提交失败,页面自然不会跳转,也就看不到列表里的"New title"。
你可以在find('#saveMailAuto').click之后加一句调试代码,看看点击保存后的实际页面:
save_and_open_page
运行测试后会自动打开浏览器展示当前页面,如果看到的还是创建表单页,并且有"字段不能为空"这类错误提示,那就是这个问题了。解决方法很简单:在测试里把所有必填字段都填充完整,比如:
before do visit new_client_project_mail_auto_group_path(project) fill_in 'mail_auto_group[name]', with: 'New title' # 补充填充其他必填项,示例如下,根据实际字段调整 fill_in '提取条件', with: 'Test extraction condition' fill_in '主题', with: 'Test email subject' fill_in 'HTML正文', with: 'Test HTML content' # 下拉框选择逻辑保留 first('.nice-select.form-input__select').click page.all('.option')[1].click find('#saveMailAuto').click end
2. 检查元素定位是否准确
- 标题填充的可靠性优化:你的HAML里label文本是"配送标题",对应的input id是
mail_auto_group_name,用label文本填充比用name属性更稳定,能避免name属性变更导致的定位失败:fill_in '配送标题', with: 'New title' - 下拉框选择是否真的生效:自定义下拉框(比如nice-select)有时候会有JS交互延迟,你可以加个断言验证选中状态:
first('.nice-select.form-input__select').click target_option = page.all('.option')[1] target_option.click # 替换成你实际的选项文本,验证下拉框是否显示了选中内容 expect(first('.nice-select.form-input__select')).to have_content(target_option.text) - 保存按钮的有效性:确认
#saveMailAuto这个id的按钮确实是表单的提交按钮,没有绑定阻止默认提交行为的JS代码。
3. 确认页面跳转和断言时机
有时候页面跳转需要短暂等待,虽然Capybara会自动等待元素,但你可以显式验证是否跳转到了目标列表页,再做内容断言:
scenario 'The distribution title registered in the distribution list is displayed' do # 验证页面已跳转到配送列表页,替换成你的实际列表页路径 expect(page).to have_current_path(client_project_mail_auto_groups_path(project)) expect(page).to have_content 'New title' end
另外注意大小写敏感:你的错误信息里显示断言的是'new title'(全小写),但测试代码里写的是'New title'——如果Capybara配置了大小写敏感(默认是敏感的),这也会导致断言失败,要确保断言文本和页面实际显示的完全一致。
4. 检查数据是否真的被保存
如果页面确实跳转到了列表页,但还是看不到标题,可能是数据没被成功写入数据库。你可以在断言前直接查询数据库验证:
scenario 'The distribution title registered in the distribution list is displayed' do # 替换成你的实际模型类名 expect(MailAutoGroup.last.name).to eq('New title') expect(page).to have_content 'New title' end
如果数据库里没有这条数据,说明后端create动作可能有逻辑错误,需要检查控制器代码。
内容的提问来源于stack exchange,提问作者Animesh
相关产品推荐
相关产品推荐

