私は Rails と RSpec でコントローラー テストを書いていますが、ソース コードを読むと、ActionController::TestCase
任意のクエリ パラメーターをコントローラーに渡すことはできないようです。ルーティング パラメーターのみです。
この制限を回避するために、現在使用していwith_routing
ます:
with_routing do |routes|
# this nonsense is necessary because
# Rails controller testing does not
# pass on query params, only routing params
routes.draw do
get '/users/confirmation/:confirmation_token' => 'user_confirmations#show'
root :to => 'root#index'
end
get :show, 'confirmation_token' => CONFIRMATION_TOKEN
end
ご想像のとおり、Devise 用のカスタム Confirmations コントローラーをテストしています。これは、既存の API を利用していて、実際のマッピングがどのようにconfig/routes.rb
行われるかを変更するオプションがないことを意味します。
これを行うためのよりきちんとした方法はありますか?get
クエリ パラメータを渡す方法はサポートされていますか?
編集:何か他のことが起こっています。https://github.com/clacke/so_13866283で最小限の例を作成しました。
spec/controllers/receive_query_param_controller_spec.rb
describe ReceiveQueryParamController do
describe '#please' do
it 'receives query param, sets @my_param' do
get :please, :my_param => 'test_value'
assigns(:my_param).should eq 'test_value'
end
end
end
app/controllers/receive_query_param_controller.rb
class ReceiveQueryParamController < ApplicationController
def please
@my_param = params[:my_param]
end
end
config/routes.rb
So13866283::Application.routes.draw do
get '/receive_query_param/please' => 'receive_query_param#please'
end
このテストはパスしたので、ルーティングで奇妙なことをしているのは Devise だと思います。
編集:
Devise ルートが定義されている場所を固定し、それに一致するようにサンプル アプリを更新しました。
So13866283::Application.routes.draw do
resource :receive_query_param, :only => [:show],
:controller => "receive_query_param"
end
...そして仕様とコントローラーがそれに応じて更新され、使用されます#show
。テストは引き続きパスします。つまり、params[:my_param]
によって移入されget :show, :my_param => 'blah'
ます。それで、なぜこれが私の実際のアプリで起こらないのかはまだ謎です。