2016-05-25 4 views
2

私はRSpecコントローラ仕様を持っていますが、私の例では正確な経路がどのように呼び出されているかを知る方法を理解しようとしています。 services_controller_spec.rbでRSpecコントローラ仕様で呼び出されている経路を特定する方法

describe 'create comment' do 
    let!(:service) { FactoryGirl.create(:service) } 

    describe 'with valid comment' do 
    it 'creates a new comment' do 
     expect { 
     post :add_comment, id: service.id 
     }.to change(service.service_comments, :count).by(1) 

     expect(response).to redirect_to(service_path(service)) 
    end 
    end 
end 

ポストを経由して送信されているppまたはputsルートに方法はありますか?

postには/services/:id/add_commentのルートに欲しいと頼んでいて、正確にルートがどこに行くのか確認したいと思っています。

このルートのマイroutes.rbを:

routes.formatter.send(
    :match_route, 
    nil, 
    controller: ServicesController.controller_path, 
    action: 'add_comment', # what you passed to the get method, but a string, not a symbol 
    id: service.id   # the other options that you passed to the get method 
) { |route| puts route.name } 

RSpecのレール:あなたはこのような何かをRSpecのレールコントローラの仕様で使用されるルートの名前を印刷することができ

resources :services do 
    member do 
    post 'add_comment' 
    end 
end 
+0

'describe ServicesController'ブロックを表示すると役に立ちます。 –

答えて

1

内部的にのみルートを使用します。上記は、rspec-rails(実際にはrspec-railsが使用するActionController::TestCase)がルックアップを参照してルートを使用する方法ですが、ルートだけを出力するブロックを使用しています。

postコールと仕様の間には多くのメソッド呼び出しがありますので、rspec-railsが上記にどのようになっているか理解したい場合は、例を実行する前にブレークポイントをActionDispatch::Journey::Formatter.match_routesに置くことをお勧めします。

rspec-railsコントローラ仕様では、どのアクションメソッドを呼び出すか、どのコントローラクラスを呼び出すかを決定するルートは使用されません。 describeに渡すコントローラークラスと、アクションメソッド(getpostなど)に渡すアクションから、それらを既に知っています。ただし、ルートをルックアップして要求環境のフォーマットに使用します。他の用途のなかでも、パスはrequest.env['PATH_INFO']になります。

私はRails 4.1でこれを調べました。これは私が便利な使い方をしているプロジェクトだからです。他のバージョンのRailsでは正確ではないかもしれません。

+0

上記のコードを実行しようとしましたが、 'undefined method:formatter 'というエラーが出ました。思考?新しいものをインポートする必要はありますか?助けてくれてありがとう。 – sainid

+0

どのバージョンのRailsとrspec-railsを使用していますか? –

+0

Rails 4.1.8 Rspec 3.4.4 – sainid

関連する問題