Rails和针对旧数据库的测试

时间:2011-12-07 22:37:46

标签: ruby-on-rails ruby-on-rails-3

所有

有点技术性。

我已经构建了一个很好的小Rails应用程序,它依赖于一些外部数据库(未在本地迁移中定义)来增强核心应用程序信息。我坐下来写一些测试,发现自己正在努力寻找支持这种外部数据的正确解决方案。

例如,假设我的新/当前Rails应用程序中有一个'DailyWidgetViews'模型。在表级,它看起来像:

id, widget_id, date, views, timestamps

假设Widgets位于不同的数据库中。在Rails中存在可以很好地处理这种情况的工具。例如,在定义Widget时,您可以执行以下操作:

class Widget << ActiveRecord::Base
  establish_connection("some_legacy_db_name")
  set_table_name :crazy_widget_table_name

现在在DailyWidgetViews中,我可以构建一个很好的belongs_to关联,一切都很好。

然而,当需要测试时该怎么办???

假设我有一个DailyWidgetViews资源,并希望测试/ index操作并返回每个DailyWidgetView的Widget关联。建议的定义和与外部数据交互的策略是什么?即使我模拟了所有内容,test:unit和rspec也希望在测试数据库中找到Widget的定义。此外,应用程序中的一些缓存优化也希望在应用程序加载时在这里找到一些数据(它可以是空的)。

我看到它们的一些潜在选择:

  1. 构建一个仅包含迁移的单独项目。这些迁移在其中具有支持传统架构的最低限度。在需要时运行此项目以获取架构设置。模拟测试中的所有内容,以便我们永远不会与此数据库进行交互。

  2. 导出旧架构并破解db:setup以在测试运行之前将架构加载到相应的测试dbs中。模拟#1中的所有内容。

  3. 我倾向于选项#1,但希望之前有人处理过这个问题。任何人吗?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

你真正需要做的就是制作rake db:test:prepare做正确的事情是在schema.rb文件中获取正确的架构。

所以,如果你想让那个文件正确,你有几个选择 - 可能更多,但是会想到这些。

  1. 只需手动编辑您需要的架构信息。我不建议这样做,因为如果你需要在dev / prod中从头开始运行迁移,这个文件就会被更改。
  2. 创建设置您需要存在的表的迁移,然后只依赖环境中的RAILS_ENV和应用程序中的Rails.env,以便将其指向正确的数据库。