You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5.2.6 Cucumber测试中@cocktails未传递到视图故障排查

问题根因

这是Cucumber+Capybara测试场景下的典型数据库事务隔离问题:你的RSpec配置开启了事务型测试,测试用例运行过程中创建的所有数据都保存在未提交的事务中,测试结束后直接回滚。但Cucumber调用浏览器驱动(比如Selenium)时会启动独立的Rails服务线程,该线程和测试用例线程不在同一个数据库事务上下文中,无法读取到测试线程未提交的记录,所以才会出现控制器查询不到数据的情况。

修复步骤

1. 调整DatabaseCleaner配置适配Cucumber场景

在Cucumber的配置目录下新增features/support/database_cleaner.rb,添加以下代码,区分不同驱动的数据库清理策略:

Cucumber::Rails::Database.javascript_strategy = :truncation

Before do
  # 无界面的rack_test驱动可以继续用性能更高的事务策略,带浏览器的驱动用截断策略
  DatabaseCleaner.strategy = Capybara.current_driver == :rack_test ? :transaction : :truncation
  DatabaseCleaner.start
end

After do
  DatabaseCleaner.clean
end

2. 关闭冲突的事务配置

修改你的rails_helper.rb文件,将config.use_transactional_fixtures = true改为false,避免Rails默认的事务测试机制和DatabaseCleaner的配置冲突。

排查打印方法

如果后续需要排查类似的数据问题,可以直接在Cucumber步骤中添加打印代码验证数据状态:

Given('I have populated a cocktail list for this User') do
  FactoryBot.create(:cocktail,
                    user: @registered_user,
                    name: "Frank Wallbanger",
                    ingredients: "Lots of Booze, a pinch of lime")
  FactoryBot.create(:cocktail,
                    user: @registered_user,
                    name: "Fuzzy Naval Orange",
                    ingredients: "Lots of Tequila, a pinch of orange")
  # 打印全局鸡尾酒记录数,验证是否创建成功
  puts "数据库中总鸡尾酒记录数:#{Cocktail.count}"
  # 打印对应用户的鸡尾酒记录数,验证关联是否正常
  puts "当前用户关联的鸡尾酒记录数:#{@registered_user.reload.cocktails.count}"
end

修改完成后重新运行Cucumber测试即可正常读取到创建的记录。

内容的提问来源于stack exchange,提问作者Drew Peterson 7671

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 10:51:03