Ruby on rails 在Rspec中创建的记录是';在新线程中不可用?

Ruby on rails 在Rspec中创建的记录是';在新线程中不可用?,ruby-on-rails,ruby,multithreading,rspec,Ruby On Rails,Ruby,Multithreading,Rspec,在Rspec中,我正在创建记录,例如,let!(:user){create(:user)} 我可以在Rspec和主题的主线程中访问新用户。这两者都返回用户: puts User.all.to_a puts ActiveRecord::Base.connection.exec_query('select * from users') 但是,我现在可以在新线程中更长时间地访问用户: Thread.new do puts User.all.to_a puts ActiveRecord

在Rspec中,我正在创建记录,例如,
let!(:user){create(:user)}

我可以在Rspec和主题的主线程中访问新用户。这两者都返回用户:

puts User.all.to_a
puts ActiveRecord::Base.connection.exec_query('select * from users')
但是,我现在可以在新线程中更长时间地访问用户:

Thread.new do
    puts User.all.to_a
    puts ActiveRecord::Base.connection.exec_query('select * from users')
end

我该如何解决这个问题?这只是Rspec问题吗?我认为我无法在Rails控制台中复制它。

您可能已经将RSpec配置为在数据库事务中运行它的测试

引自: >

运行
rails generate rspec:install
时,
spec/rails\u helper.rb
文件 包括以下配置:

RSpec.configure do |config|
  config.use_transactional_fixtures = true
end
此设置的名称有点误导。它在Rails中的真正含义 是“运行事务中的每个测试方法”, 这意味着“运行事务中的每个示例”

我们的想法是从一个干净的数据库开始,创建任何数据 对于该示例是必需的,然后通过简单的回滚来删除该数据 示例末尾的事务

当应用程序测试要求同时支持多个线程时,可能需要禁用此配置


但这意味着,当测试完成时,您的测试数据库将不再自动从测试数据中清除。相反,您需要手动删除测试数据,或者在运行测试后使用另一个gem(like)重置数据库。

我们需要查看整个测试,您确定在运行该线程之前创建了用户吗?您确定该线程正在连接到同一个数据库吗?检查
ActiveRecord::Base.connection\u config