gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:45:41 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com