1

声明的(快速)测试目的的一类模式是伟大的:使用Rails在已经宣布

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 

它的问题是,它似乎打破轨道模型自动加载当整个规格的套房跑。

以前声明类时,模型不再加载。

4 ways of injecting the unloaded dependencies

  1. 声明类(如实施例在这里)
  2. 设置/删除常量
  3. 存根的包装方法
  4. 实际上加载它们

我只想使用第一个。

问题:保持相同的规格结构,我怎么能告诉轨道实际上加载模型,即使该类已被声明?

回答

1

为了让您的空类抢占招工作,你必须设置你的应用程序config.cache_classes = false,从而预先加载是不会发生,除非你叫

Rails.application.eager_load! 

当运行整个测试套件,你需要确保类预加载,则空重定义应该没有效果。

现在的问题是如何控制它只在调用完整的测试套件时才运行。诚实的答案是我不知道,但你肯定可以从环境中控制它。在某处,rspec的助手初始化轨,其更新到类似:

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 
+0

感谢维克多。这似乎是做这项工作。然而,我得到'警告:已经初始化常量MIN_NO_CASH_FLOW_PERIODS',这可能与我有时只声明类的事实有关,但有时我实际上'需要'它。因此它现在被加载两次。对此有何想法? –

+0

哎呀,你可能需要一个真正的红宝石向导。没有线索 –

+0

这个常数是我的,当然我知道它在哪里。只是该文件被加载了两次:第一次当我调用'eager_load!'时,第二次当我从另一个规范中需要该文件时。 –

相关问题