2012-09-21 7 views
5

私はrequest.fullpathにアクセスするヘルパーを持っています。隔離されたヘルパーテストでは、requestは利用できません。私は何をすべきか?どういうわけかそれを嘲笑してもらえますか?Rails:Rails環境へのアクセスが必要なヘルパー(例えばrequest.fullpath)をテストします。

私はRailsとRSpecの最新バージョンを使用しています。だから、問題のコード行は、ヘルパーはヘルパーの仕様では使用できませんrequestオブジェクトにアクセスする必要がある#4である

def item(*args, &block) 
    # some code 

    if request.fullpath == 'some-path' 
    # do some stuff 
    end 
end 

:ここでは私のヘルパーは次のようになります。

ありがとうございました。ヘルパーの仕様で

+0

持っていますか? – Rubyman

+0

はい、あります。ありがとう。 –

答えて

4

はい、あなたは要求を模擬することができます。私はそれをどうやって行うのかについて長い間答えてきましたが、実際にはそれは必ずしもあなたが望むものではありません。

例のヘルパーオブジェクトでヘルパーメソッドを呼び出してください。同様に:

describe "#item" do 
    it "does whatever" do 
    helper.item.should ... 
    end 
end 

これで、テストリクエストオブジェクトにアクセスできます。実際には、完全を期すために、私はあなたがしようとしているものに応じているので、私のオリジナルの答えが含まれてみましょう

before :each do 
    helper.request.path = 'some-path' 
end 

:あなたが要求パスの特定の値を指定する必要がある場合、あなたはこのようにそれを行うことができますこれはまだ役立つかもしれません。ここで

は、あなたがリクエストを模擬することができます方法は次のとおりです。

request = mock('request') 
controller.stub(:request).and_return request 

あなたはすべて1行で&スタブを模擬するために返された要求も同様

request.stub(:method).and_return return_value 

や代替構文にスタブメソッドを追加することができます。

request = mock('request', :method => return_value) 

あなたのモックがメッセージを受け取った場合、Rspecは文句を言いますあなたがスタブしなかったもの他のものがある場合ヘルパーオブジェクトのリクエストヘルパーメソッドを呼び出すだけで、テストで気にしないことができます。モックを "nullオブジェクト"にすることでrspecを終了できます。同様のようなので、

request = mock('request').as_null_object 

すべてのあなたはおそらくあなたの特定のテスト合格を取得する必要がありますように見えますが、このされる:あなたのspec_helper.rbで「『RSpecの/レールを』必要」

describe "#item" do 
    let(:request){ mock('request', :fullpath => 'some-path') } 

    before :each do 
    controller.stub(:request).and_return request 
    end 

    it "does whatever" 
end 
+0

私の以前の答えは無視してください。リクエストオブジェクトを模擬する方法について説明しましたが、それはヘルパー仕様で必要なものを得る正しい方法ではありません。上記を参照。 – gregates

+0

ありがとう、それは魅力のように動作します。それでも、私は少し不明です、なぜそれがします。 'helper.my_method'への直接呼び出しは単純な' my_method'呼び出しと同じではありませんか?ヘルパーをテストするとき、私はいつも 'ヘルパー'オブジェクトでそれらを呼び出すべきですか?コントローラとビューのテストにも同様のオブジェクトがありますか? –

+1

ありがとうございます!匿名のコントローラでできることはたくさんあります。 rspec-railsはApplicationControllerを継承する 'controller'オブジェクトを提供し、before_filtersやその他のものをテストするためにスタブアクションを定義することができます。正直なところ、私はあなたがなぜヘルパーオブジェクトであなたのメソッドを呼び出す必要があるのか​​を説明するのに十分な専門家であるかどうかはわかりません。 https://www.relishapp.com/rspec/rspec-rails/v/2-11でrspecのドキュメントを勉強することをお勧めします。 – gregates

0

、あなたはcontroller.requestを使用して要求にアクセスすることができます(そうcontroller.request.stub(:fullpath) { "whatever" }が動作するはずです)

+0

ありがとうございますが、これはヘルパーで 'request'オブジェクトを利用できるようにしていないようです(問題です)。 –

関連する問題