如何在RSpec测试中包含大型支持数据库?

时间:2013-05-05 20:08:18

标签: ruby-on-rails testing rspec postgresql-9.2 rails-postgresql

我有3个大型只读数据库支持我的Rails 3.2应用程序,因为它们中的值被检查,其中一些与辅助信息一起存储在我的主数据库中。我在开发和生产Postgres数据库时将这些设置为模式。

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

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

我不能将这些环境复制到test,每次运行时都会受到影响:

rake db:test:prepare

1 个答案:

答案 0 :(得分:1)

如果我理解得对:

  • 您有3个大型数据库,其中包含用于运行应用程序必需的支持数据
  • 由于它们很大,您不希望将它们存储为XML / JSON /序列化文件,并且您希望将它们放在数据库中以便于查询
  • 您希望能够在所有您的环境和服务器中访问相同的3个数据库

所以你在这里所拥有的基本上与源代码配置相同,理想情况下应该是你的代码库的一部分。即它是fixture,虽然是数据库夹具而不是YAML或JSON夹具。

理想的解决方案是,您应该将该数据库转储转换为fixture。方法如下:

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

    <%
      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定义,否则这种方法的工作范围更广。但是我猜你的主数据库和这3个数据库之间已经没有直接关系了,因为在大多数情况下跨数据库引用很难处理。