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. クラスを宣言します (ここの例のように)
  2. const の設定/削除
  3. ラッパー メソッドをスタブする
  4. 実際にロードする

1枚目だけ使いたい。

質問:クラスが既に宣言されている場合でも、同じ仕様構造を維持しながら、レールに実際にモデルをロードするように指示するにはどうすればよいですか?

4

1 に答える 1

1

空のクラス プリエンプション トリックが機能するには、 app を設定する必要がconfig.cache_classes = falseあるため、呼び出さない限り熱心な読み込みは行われません。

Rails.application.eager_load!

テスト スイート全体を実行するときは、クラスがプリロードされていることを確認する必要があります。空の再定義は効果がありません。

問題は、完全なテスト スイートが呼び出された場合にのみ実行されるように制御する方法です。正直なところ、わかりませんが、環境から確実に制御できます。rspec ヘルパーのどこかでレールを初期化し、次のように更新します。

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 に答える