Ruby on rails 使用已声明的Rails模型

Ruby on rails 使用已声明的Rails模型,ruby-on-rails,testing,dependency-injection,specifications,isolation,Ruby On Rails,Testing,Dependency Injection,Specifications,Isolation,为(快速)测试目的声明类非常好: require 'fast_helper' require 'site_search' class Post; end # This allows not to load the whole Rails env describe SiteSearch do it "searches on posts" do Post.stub_chain(:scoped, :by_term).with("ruby").and_return ["post1", "

为(快速)测试目的声明类非常好:

require 'fast_helper'
require 'site_search'

class Post; end # This allows not to load the whole Rails env

describe SiteSearch do
  it "searches on posts" do
    Post.stub_chain(:scoped, :by_term).with("ruby").and_return ["post1", "post2"]
    SiteSearch.by_term("ruby").should == ["post1", "post2"]
  end
end
它的问题在于,当运行整套规范时,似乎会中断rails模型的自动加载

当类之前被声明时,不再加载模型

有:

  • 声明类(如这里的示例所示)
  • 设置/删除常量
  • Stub是一个包装器方法
  • 实际加载它们
  • 我只想用第一个


    问题:保持相同的规范结构,即使类已经声明,我如何告诉rails实际加载模型?

    为了让空类抢占技巧发挥作用,您必须设置应用程序
    config.cache\u classes=false
    ,因此除非您调用

    Rails.application.eager_load!
    
    当运行整个测试套件时,您需要确保类预加载,然后空的重新定义应该没有效果

    现在的问题是,您如何控制它仅在调用完整测试套件时运行。诚实的回答是我不知道,但你肯定可以从环境中控制它。在rspec帮助程序中的某个地方,您可以初始化rails,并将其更新为如下内容:

    ENV["RAILS_ENV"] ||= 'test'
    require File.expand_path("../../config/environment", __FILE__)
    require 'rspec/rails'
    Rails.application.eager_load! unless ENV["FORCE_EAGER_LOAD"].blank?
    
    然后在完整套件上致电rspec:

    FORCE_EAGER_LOAD=t rspec
    

    为了让你的空类抢占技巧发挥作用,你必须设置你的应用程序
    config.cache\u classes=false
    ,因此除非你调用

    Rails.application.eager_load!
    
    当运行整个测试套件时,您需要确保类预加载,然后空的重新定义应该没有效果

    现在的问题是,您如何控制它仅在调用完整测试套件时运行。诚实的回答是我不知道,但你肯定可以从环境中控制它。在rspec帮助程序中的某个地方,您可以初始化rails,并将其更新为如下内容:

    ENV["RAILS_ENV"] ||= 'test'
    require File.expand_path("../../config/environment", __FILE__)
    require 'rspec/rails'
    Rails.application.eager_load! unless ENV["FORCE_EAGER_LOAD"].blank?
    
    然后在完整套件上致电rspec:

    FORCE_EAGER_LOAD=t rspec
    

    谢谢你,维克多。这似乎很管用。然而,我得到了
    警告:已经初始化了常量MIN\u NO\u CASH\u FLOW\u PERIODS
    ,这可能与我有时只是声明类有关,但有时我实际上需要它。因此,它现在加载了两次。有什么想法吗?哦,你可能需要一个真正的ruby向导。这个常数是我的,当然我知道它在哪里。只是文件加载了两次:第一次我调用
    eager\u load,这是我第二次从(另一个)规范中需要该文件。谢谢Viktor。这似乎很管用。然而,我得到了
    警告:已经初始化了常量MIN\u NO\u CASH\u FLOW\u PERIODS
    ,这可能与我有时只是声明类有关,但有时我实际上需要它。因此,它现在加载了两次。有什么想法吗?哦,你可能需要一个真正的ruby向导。这个常数是我的,当然我知道它在哪里。只是文件加载了两次:第一次我调用
    eager\u load,这是我第二次从(另一个)规范中需要该文件。