2016-06-29 19 views
1

私はこのプライベートメソッドを確認するためのコントローラ仕様を作成していますが、エラーModule::DelegationError: ActionController::RackDelegationが表示されますが、これを解決する方法が失われています。私が見つけた最良の例はhttp://owowthathurts.blogspot.com/2013/08/rspec-response-delegation-error-fix.htmlでした。RspecのAPIコントローラテストモジュールで委任エラーが発生する

unverifiedの仕様はどのようにすればいいですか?私は401が返されていることを確認したい。

方法

def validate_api_request 
    return four_oh_one unless api_request_verified?(request) 
end 

現在のスペック

describe Api::ApiController, type: :controller do 
    describe '#validate_api_request' do 
    it 'verified' do 
     allow_any_instance_of(described_class).to receive(:api_request_verified?).and_return(true) 
     expect(subject.send(:validate_api_request)).to be_nil 
    end 

    it 'unverified' do 
     allow_any_instance_of(described_class).to receive(:api_request_verified?).and_return(false) 
     allow(controller).to receive(:redirect_to) 
     binding.pry 
    end 
    end 
end 

私が使用しているRailsの

+0

多分問題は、あなたが 'redirect_to'への呼び出しをスタブして、レンダリングもリダイレクトもしなくなってしまうことです。 'receive(:redirect_to).and_call_original'を試してください。 – Raffael

+0

@Raffael私はこれを以下の設定で解決しましたか? –

答えて

0

4.誰もが、コントローラの仕様を書く同様の問題に取り組んでいる場合は、ここにありますどのように私はこれらの2つのガイドに基づいて解決した:http://codegur.com/22603728/test-user-authentication-with-rspechttps://gayleforce.wordpress.com/2012/12/01/testing-rails-before_filter-method/

describe Api::ApiController, type: :controller do 
    describe '#validate_api_request' do 
    controller(Api::ApiController) do 
     before_filter :validate_api_request 
     def fake 
     render text: 'TESTME' 
     end 
    end 

    before do 
     routes.draw { get 'fake', to: 'api/api#fake' } 
    end 

    it 'verified' do 
     allow_any_instance_of(described_class).to receive(:api_request_verified?).and_return(true) 
     expect(subject.send(:validate_api_request)).to be_nil 
    end 

    it 'unverified' do 
     allow_any_instance_of(described_class).to receive(:api_request_verified?).and_return(false) 
     get 'fake' 
     expect(response.status).to be(401) 
    end 
    end 
end 
+0

これで、プライベートメソッドのテストを具体的なコントローラメソッドからより強力に切り離しました。これにより、テストがより簡潔になります。このプライベートメソッドがアプリケーション全体で多く使用されている場合は、新しいアプローチが大好きです。そうでなければ、追加された複雑さがそれに値するかどうか尋ねるかもしれない – Raffael

+0

うん、それは私がそれを激しく打つことを望んでいた理由です。あなたのフィードバックに感謝します。 –

+0

このようにテストすれば、すべての例でそれを行います。私。それを変更して '' fake ''を呼び出すようにして '' TESTME ''がレンダリングされることを示していることを示します。 – Raffael