Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 针对多个数据库的测试和数据库清理器_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 针对多个数据库的测试和数据库清理器

Ruby on rails 针对多个数据库的测试和数据库清理器,ruby-on-rails,ruby,Ruby On Rails,Ruby,我们有一个邮箱模型,它使用另一个邮件应用程序也连接到的辅助数据库。这叫做使用 establish_connection :mail_database 现在,我想我可以尝试将它包装在一个if语句中,以便它对测试环境使用不同的连接,但我想知道如何保持这个数据库干净,最好使用我们已经用于“常规”数据库的database_cleaner 我希望有人能把我推向正确的方向。我有一个rails3.2.10应用程序,使用rspec(2.12.0)和database_cleaner(0.9.1 f4b44bb)

我们有一个邮箱模型,它使用另一个邮件应用程序也连接到的辅助数据库。这叫做使用

establish_connection :mail_database
现在,我想我可以尝试将它包装在一个
if
语句中,以便它对测试环境使用不同的连接,但我想知道如何保持这个数据库干净,最好使用我们已经用于“常规”数据库的database_cleaner


我希望有人能把我推向正确的方向。

我有一个rails3.2.10应用程序,使用rspec(2.12.0)和database_cleaner(0.9.1 f4b44bb)进行了测试,该程序有两个mysql数据库连接

这些设置在database.yml中,类似于:

test:
  ...
  database: my_app_test

test_my_second_connection:
  ...
  database: my_second_connection_test
第二个数据库在模型类中通过建立连接进行连接

我能够在spec/spec_helper.rb文件中根据以下设置:

此外,我还必须使用测试套件中的一些非事务性装置。因此,我必须在我的规范中添加元信息:db_truncate=>true和如下设置,以便在测试运行中更改策略:

config.before(:suite) do
  DatabaseCleaner.strategy = :transaction
  DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction
end

config.before(:each) do
  if example.metadata[:db_truncation]
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :truncation
  else
    DatabaseCleaner.start
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].start
  end
end

config.after(:each) do
  DatabaseCleaner.clean
  DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].clean
  if example.metadata[:db_truncation]
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction
  end
end

我希望你能在去年我们处理这个问题时提出一个解决方案,它经过了数百次尝试和错误迭代,最终解决方案完全是一个混乱的黑客行为。@fguillen你能详细介绍一下吗?很高兴听到你是如何做到的,因为我说这是一个很难记住的乱七八糟的黑客行为,现在我看到了项目的实际状态,我看到他们刚刚添加了一个
test\u helper.rb
方法,其中有很多
ModelName.destroy\u all
:)一位同事已经发现了这一点,但这确实是解决方案。谢谢,我有同样的情况(在Rails 3.2.12和Rspec 2.14.7上),在我的一个模型中连接到第二个数据库。当我以这种方式设置DatabaseCleaner时,我的所有模型似乎都试图连接到第二个数据库,当然,由于第二个数据库中不存在表,所以一切都失败了database@ChristerFernstrom解决这个问题运气好吗?我最终遵循了黑魔法:
config.before(:suite) do
  DatabaseCleaner.strategy = :transaction
  DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction
end

config.before(:each) do
  if example.metadata[:db_truncation]
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :truncation
  else
    DatabaseCleaner.start
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].start
  end
end

config.after(:each) do
  DatabaseCleaner.clean
  DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].clean
  if example.metadata[:db_truncation]
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction
  end
end
****set database to clean by database cleaner in rails:-****
config.before(:suite) do
   DatabaseCleaner[:active_record, :connection => :test].clean_with(:truncation)
end

config.before(:each) do
  DatabaseCleaner[:active_record, :connection => :test].strategy = :transaction
end

config.before(:each) do
  DatabaseCleaner[:active_record, :connection => :test].start
end

config.after(:each) do
  DatabaseCleaner[:active_record, :connection => :test].clean
end