为(快速)测试目的声明一个类很棒:
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 ways of injecting the unloaded dependencies :
- 声明类(如此处示例所示)
- 设置/删除常量
- stub 包装器方法
- 实际加载它们
我只想使用第一个。
问题:保持相同的规范结构,即使类已经声明,我如何告诉 rails 实际加载模型?
最佳答案
为了让你的空类抢占技巧起作用,你必须设置你的应用程序 config.cache_classes = false
,因此除非你调用
Rails.application.eager_load!
运行整个测试套件时,您需要确保预加载类,然后空重新定义应该没有效果。
现在的问题是您如何控制它仅在调用完整测试套件时才运行。诚实的回答是我不知道,但你肯定可以从环境中控制它。在你的 rspec helpers 的某个地方你初始化了 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
关于ruby-on-rails - 使用已经声明的 Rails 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11133712/