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
相关产品推荐
相关产品推荐

