对于active_record_spec_helper,需要ActiveRecord模型而不需要整个类图

时间:2014-12-11 15:56:48

标签: ruby-on-rails ruby-on-rails-3 testing rspec rails-activerecord

我想为我的Rails测试设置一个active_record_spec_helper,这样我就可以测试我的模型而不必设置整个Rails环境 - 正如Corey Haines在他的excellent blog post on the subject中所阐述的那样。 / p>

(我知道像Spring或Guard这样的预加载器会解决这个问题,但我同意Corey的观点,即这是#34;真的只是对真实问题的创可贴#" 34。)

所以我已经设置了我的规范助手以及Corey的博文和this GitHub gist中列出的其他文件 - 但我的问题正如我在my comment中所描述的那样同样的要点:

基本上,我的模型之间的关联意味着要测试单个模型,我必须require这么多其他模型文件,它否定了首先使用active_record_spec_helper的要点。

E.g。如果我想测试comment.rb但我的评论belongs_to :post,那么我必须要求post以及comment才能让我的测试有效。但是Post可能有其他关联,例如belongs_to :user; has_many :drafts,所以我还需要userdrafts来测试Comment ...然后userdrafts也有关联,依此类推,直到我最终在我的类图中加载几乎所有模型。

(如果这没有意义,我在the comment中给出了更详细的解释。)

是否可以解决此问题并避免require所有这些无关的模型文件?或者是否存在一些我缺失的概念 - 我应该避免在这个巨大的网络中链接我的所有模型,还是不可避免?

或者只是不值得努力,我是否应该坚持让rails_helper加载整个环境?

2 个答案:

答案 0 :(得分:2)

我认为你没有遗漏任何概念,我认为通过关联在巨型网络中链接的模型在大型Rails应用程序中很自然。

至于这个问题的解决方法,我可以想到几个:

  • 在测试直接依赖于它们的模型时,存根所依赖的模型。这将消除加载或存根间接依赖的模型的需要。

  • 开启自动加载功能。虽然这会减慢速度,但与启动所有Rails

  • 并不相同
  • 而不是仅仅将您的依赖项列为Corey建议的模型顶部的注释,而是在Ruby代码中表达它们。此代码可以是生产中的无操作,但在测试中,您可以将代码配置为根据需要要求或存根依赖项。

答案 1 :(得分:0)

我能够通过使用FactoryGirl来解决这个问题。请see my gist for details

使用factory_girl_require_helper.rb,您可以在测试的顶部执行以下操作:

require_factory_and_model_for(:comment)

这将根据您为其定义的工厂自动加载依赖于Comment的任何关联模型。