ruby-on-rails - 使用已经声明的 Rails 模型

标签 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", "post2"]
    SiteSearch.by_term("ruby").should == ["post1", "post2"]
  end
end

它的问题是,当运行整套规范时,它似乎会破坏 rails 模型的自动加载。

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

4 ways of injecting the unloaded dependencies :

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

我只想使用第一个。

问题:保持相同的规范结构,即使类已经声明,我如何告诉 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/

相关文章:

c# - 我如何为 Ninject 提供额外的参数?

c# - 依赖注入(inject)/SOLID 担忧

ruby-on-rails - 带有 Rails Controller 错误 : undefined method `action' for MessageController:Class 的 websocket

ruby-on-rails - ruby mechanize 网站抓取总是只返回 javascript 数据

ruby-on-rails - 将用户 ID 添加到 Rails 中的所有日志消息

unit-testing - 如何制作用于测试的扩展入口决策表

haskell - 快速检查,使用结果取决于其参数的函数定义任意实例

oracle - 如何检测 Oracle 10g 以获得表访问指标?

javascript - 加载正文(侧边栏除外)| Turbolinks rails

java - 如何使用依赖注入(inject)模式实现类常量静态字段声明