Ruby on rails 使用已声明的Rails模型
为(快速)测试目的声明类非常好:Ruby on rails 使用已声明的Rails模型,ruby-on-rails,testing,dependency-injection,specifications,isolation,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", "
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模型的自动加载
当类之前被声明时,不再加载模型
有:
问题:保持相同的规范结构,即使类已经声明,我如何告诉rails实际加载模型?为了让空类抢占技巧发挥作用,您必须设置应用程序
config.cache\u 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
为了让你的空类抢占技巧发挥作用,你必须设置你的应用程序
config.cache\u 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
谢谢你,维克多。这似乎很管用。然而,我得到了
警告:已经初始化了常量MIN\u NO\u CASH\u FLOW\u PERIODS
,这可能与我有时只是声明类有关,但有时我实际上需要它。因此,它现在加载了两次。有什么想法吗?哦,你可能需要一个真正的ruby向导。这个常数是我的,当然我知道它在哪里。只是文件加载了两次:第一次我调用eager\u load代码>,这是我第二次从(另一个)规范中需要该文件。谢谢Viktor。这似乎很管用。然而,我得到了警告:已经初始化了常量MIN\u NO\u CASH\u FLOW\u PERIODS
,这可能与我有时只是声明类有关,但有时我实际上需要它。因此,它现在加载了两次。有什么想法吗?哦,你可能需要一个真正的ruby向导。这个常数是我的,当然我知道它在哪里。只是文件加载了两次:第一次我调用eager\u load代码>,这是我第二次从(另一个)规范中需要该文件。