3

我有3个支持我的Rails 3.2应用程序的大型只读数据库,它们中的值被检查,其中一些数据与辅助信息一起存储在我的主数据库中。我将这些设置为我的开发和生产Postgres数据库中的架构。如何在我的RSpec测试中包含大型支持数据库?

这是错误的方法?由于它们只是只读的,有没有更好的方法让它们生活在自己的Postgres数据库中,并从那里引用它们?我不认为PG宝石是这样工作的。

如果他们需要在每一个环境下,我怎么能保证他们是我的测试环境的一部分?

我不能只是这些环境复制到test,他们将获得疲惫不堪的我每次运行:

rake db:test:prepare 
+0

也许这些答案可以帮助您:http://stackoverflow.com/questions/5916126/how-do-i-prepare-test-databases-for-rails-rspec-tests-without-running-rake-spe – Mattherick 2013-05-05 22:19:12

+0

谢谢Mattherick,但这种情况有点不同。这些人似乎在为他们的测试环境做自定义的事情,而我试图避免为这些只读数据库做自定义事情。 – AKWF 2013-05-06 02:12:33

回答

1

如果我的理解没错:

  • 你有3个与大型数据库支持的数据是必不可少的运行你的应用程序
  • 由于它们很大,你不想将它们存储为XML/JSON /序列化文件,而且你更喜欢有t下摆的数据库,便于查询
  • 您希望能够访问相同的3个数据库中所有您的环境和服务器

所以,你这里有什么基本的东西是看齐源代码配置,它应该理想地成为您的代码库的一部分。即它的一个fixture,尽管是数据库夹具而不是YAML或JSON夹具。

理想的解决方案是,您应该将该数据库转储转换为夹具。这里是如何:

  • 乘坐PostgreSQL backup of the data,并将其保存为test/fixtures/your_model_name.dmp
  • 创建一个新的ERB夹具test/fixtures/your_model_name.erb。 ERB灯具可以有Ruby代码
  • 在ERB夹具添加以下代码:

    <% 
        cfg = YourModel.connection_config 
        FileUtils.sh "psql " + 
           "-u #{cfg['username']} " + 
           "-p #{cfg['password']} " + 
           "-h #{cfg['host'] || 'localhost'} " + 
           " < #{Rails.root + '/test/fixtures/yourmodel.dmp'}" 
    %> 
    

既然是ERB文件,它会自动运行它里面的代码,并且将数据导入到PostgreSQL的。唯一的问题是你需要在路径上使用psql。如果您的应用程序服务器和数据库位于不同的位置,那么您需要ssh进入服务器,然后运行导入。

另一种选择是直接将这些数据库保存为SQLite文件,然后单独为这3个模型use a separate connection。这更加广泛,除非在主应用程序表和这3个表之间没有任何直接外键引用和RESTRICT/CASCADE定义。但是我想你的主数据库和这三个数据库之间并没有直接的关系,因为跨数据库引用在大多数情况下都是很痛苦的。

相关问题