2012-03-02 17 views
0

私は、レールの有無にかかわらず使用できる宝石を書いています。いくつかの場所では、rspecのスタブ:: Rails.rootはどうすればよいですか?

path = Rails.root if defined?(::Rails) 

のようなコードを使用し、このロジックをrspecでテストしたいと考えています。私は

stub(:"::Rails").should_receive(:root).and_return("/rails") 

のようにそれをスタブ試してみましたが、これはdefined?(::Rails)trueに評価がありません。

答えて

2

defined?(::Rails)がtrueと評価されても、メソッドスタブを挿入するにはさらにRailsオブジェクトが必要です。これを行うには、いくつかの方法があるかもしれません、次は私の好ましい方法の例です:

before(:each) do 
    unless defined?(::Rails) 
    @mocked_rails_class = true 
    class ::Rails 
    end 
    end 
end 

it do 
    ::Rails.should_receive(:root).and_return('/rails') 
    your_method.should == '/rails' 
end 

after(:each) do 
    # Clean up the Rails class if it's generated by the test case. 
    Object.send(:remove_const, :Rails) if @mocked_rails_class 
end 

私はそれがすべてのRubyのバージョンで動作するかどうかわからないんだけど、少なくともそれはRubyの1.9.x.で作業することができます

+0

これは美しく機能します。ありがとう! –

+1

私にとっては、Railsのための '未定義のメソッド 'should_receive'に行きます:Module' – Michael

+0

新しいRspecでは' whatever.should'のすべてのインスタンスを 'expect(whatever).to'に置き換える必要があります。 –

関連する問題