我对RSpec很新,并且一直在尝试为我的网站创建一些测试,用户可以在网站上发布预订,然后保存到我们的数据库。我一直在尝试使用Rspec和Capybara模拟用户向网站发布预订。我们有一个现有的测试数据库,在Rspec测试结束时,希望将新预留写入数据库,并在Rspec测试结束时删除 。
当我们运行代码时,会发生以下两件事之一:要么"工作"但新的预订无法在数据库中找到,或者我们收到此错误:
Failure/Error: Unable to find matching line from backtrace
ActiveRecord::StatementInvalid:
Mysql2::Error: This connection is in use by: #<Thread:0x007fb421fd6218 sleep>: SELECT `users`.* FROM `users` WHERE `users`.`id` = 6 ORDER BY `users`.`id` ASC LIMIT 1
# ./app/controllers/application_controller.rb:95:in `pass_login_status_to_js'
# ./app/middleware/search_suggestions.rb:12:in `call'
为什么会这样?我意识到Capybara通常不打算对数据库进行永久性更改;是否有你推荐的不同程序/宝石?
我目前有config.use_transactional_fixtures = false
,并且还根据几个网站的推荐添加了以下内容:
class ActiveRecord :: Base
mattr_accessor:shared_connection
@@ shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
重申一下,我做希望Capybara写入我的数据库(我们使用SQL)。我能做些什么不同的事情?它与数据库清理器有关吗?
答案 0 :(得分:0)
是的,它与database_cleaner
有关。如果您正确设置它,它将在场景之间清理数据库,以保持测试隔离。
有几种方法可以做你想做的事:
您可以明确告诉database_cleaner
不要在场景之间清除某些表:
DatabaseCleaner.strategy =:transaction,{except:[:countries,:states]} DatabaseCleaner.clean_with(:截断,{除:[:countries,:states]})
您可以将代码添加到before(:each)
或before(:all)
块
您可以将数据添加到一个或多个灯具
只有少数情况下你应该在场景之间共享数据(即国家,州表,这是#3的良好候选者)
在任何其他情况下,我建议不要在场景之间共享数据。