1

为(快速)测试目的声明一个类很棒:

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 模型的自动加载。

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

4 种方法可以注入卸载的依赖项

  1. 声明类(如示例here)
  2. 设置/删除常量
  3. 存根包装器方法
  4. 实际加载它们

我只想使用第一个。

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

4

1 回答 1

1

为了使您的空类抢占技巧起作用,您必须设置您的应用程序config.cache_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
于 2012-06-21T12:00:08.820 回答