【问题标题】:How can I include big support databases in my RSpec tests?如何在我的 RSpec 测试中包含大型支持数据库?
【发布时间】:2013-05-05 20:08:18
【问题描述】:

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

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

如果他们确实需要在每个环境中,我如何确保他们是我的测试环境的一部分?

我不能只是将这些环境复制到test,每次我运行它们都会受到打击:

rake db:test:prepare

【问题讨论】:

  • 也许这些答案可以帮助你:stackoverflow.com/questions/5916126/…
  • 感谢马特里克,但这种情况有点不同。这些人似乎在为他们的测试环境做定制的事情,而我试图避免只为这些只读数据库做定制的事情。

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


【解决方案1】:

如果我理解正确:

  • 您拥有 3 个包含支持数据的大型数据库,这些数据对于运行您的应用程序必不可少
  • 由于它们很大,您不想将它们存储为 XML/JSON/序列化文件,而是希望将它们保存在数据库中以便于查询
  • 您希望能够在所有您的环境和服务器中访问相同的 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 定义,否则这会更广泛地工作。但我猜你的主数据库和这 3 个数据库之间已经没有直接关系,因为在大多数情况下,跨数据库引用很难处理。

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 2011-07-11
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多