使用FactoryBot在RSpec中登录指定用户编辑Treat的问题排查
问题解决方案
核心问题分析
- 编辑按钮不显示:你创建的
Treat自动生成了独立的giver用户,但登录的是另一个无关用户,不符合「仅giver可见编辑按钮」的权限逻辑。而且你用build(:user)创建的用户未保存到数据库,登录操作可能根本无效。 - 邮箱重复错误:硬编码
User工厂的邮箱会导致每次创建用户都用同一个邮箱,触发用户邮箱唯一性验证。
具体修复步骤
1. 修改测试代码,让登录用户成为Treat的giver
把测试的before块调整为:
before do # 创建并保存要登录的用户(必须用create,build不会写入数据库) user = FactoryBot.create(:user, email: 'wojtek@gmail.com', password: 'password') # 创建Treat时指定当前用户为giver FactoryBot.create(:treat, giver: user) # 登录该用户 login_as(user) driven_by(:selenium_chrome_headless) end
2. 确保访问正确的页面
如果你的Treat列表不在root_path,比如在treats_path,需要修改测试中的访问路径:
visit treats_path # 替换原来的visit root_path
避免邮箱重复的最佳实践
不要修改User工厂的默认邮箱生成逻辑,保持Faker::Internet.email生成唯一邮箱。如果测试需要特定邮箱,在创建用户时临时传入参数覆盖,而不是修改工厂定义,这样既满足测试需求,又不会触发重复验证。
比如:
# 仅在需要固定邮箱的测试中这样创建用户 user = FactoryBot.create(:user, email: 'wojtek@gmail.com')
内容的提问来源于stack exchange,提问作者Wojtek
相关产品推荐
相关产品推荐

