【问题标题】:requiring an ActiveRecord model without having to require the entire class diagram, for active_record_spec_helper需要一个 ActiveRecord 模型,而不必需要整个类图,对于 active_record_spec_helper
【发布时间】:2014-12-11 15:56:48
【问题描述】:

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

(我知道像 Spring 或 Guard 这样的预加载器在解决这个问题方面起到了部分作用,但我同意 Corey 的论点,即这“实际上只是解决实际问题的创可贴”。)

所以我已经按照 Corey 的博客文章和 this GitHub gist 中的说明设置了我的规范帮助程序和其他文件 - 但我的问题与我在 my comment 中描述的相同:

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

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

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

是否可以解决这个问题并避免require 所有那些无关的模型文件?还是我缺少一些概念性的东西——我应该避免在这个巨大的网络中链接我的所有模型,还是不可避免?

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

【问题讨论】:

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


    【解决方案1】:

    我认为您没有遗漏任何概念性内容,而且我认为通过关联将模型链接到一个巨大的网络中是大型 Rails 应用程序中的自然选择。

    关于这个问题的解决方法,我能想到几个:

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

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

    • 不要像 Corey 建议的那样仅将您的依赖项列为模型顶部的 cmets,而是用 Ruby 代码表达它们。此代码在生产中可以是无操作的,但在测试中,您可以根据需要将代码配置为 require 或 stub 依赖项。

    【讨论】:

    • 如何在不加载整个 Rails 应用的情况下开启自动加载?它在 ActiveSupport 中的某个地方吗?
    • Ruby 自动加载机制本身是不够的,我不确定是否/如何在它之上构建的 Rails 机制可以单独调用。在描述这个选项时,我可能不应该如此油嘴滑舌。如果您无法在 Rails gem 中找到可以按原样使用的东西,您可以在 urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell 上阅读有关该功能的信息,例如,也许可以自己动手。
    【解决方案2】:

    我可以通过使用 FactoryGirl 解决这个问题。请see my gist for details

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

    require_factory_and_model_for(:comment)
    

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

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      相关资源
      最近更新 更多