Ruby on rails 在Rspec中创建的记录是';在新线程中不可用?
在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
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