4

私は 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'ます。それで、なぜこれが私の実際のアプリで起こらないのかはまだ謎です。

4

3 に答える 3

3

コントローラテストはルーティングされません。コントローラの単体テストを行っています。ルーティングはその範囲外です。

典型的なコントローラー仕様の例は、アクションをテストします。

describe MyController do
  it "is successful" do
    get :index
    response.status.should == 200
  end
end

次のようなパラメータをに渡すことで、テストコンテキストを設定しますget

  get :show, :id => 1

そのハッシュでクエリパラメータを渡すことができます。

ルーティングをテストする場合は、ルーティング仕様を記述したり、(統合)仕様を要求したりできます

于 2012-12-14T00:47:10.213 に答える
1

私は今これをやっています:

@request.env['QUERY_STRING'] = "confirmation_token=" # otherwise it's ignored
get :show, :confirmation_token => CONFIRMATION_TOKEN

...しかし、それはハッキーに見えます。

誰かが私にこれを行うためのきちんとした公式の方法を教えてくれるなら、私は喜ぶでしょう。私がソースコードで見た#getものとそれが呼び出すすべてのものから判断すると、他の方法はないようですが、私は何かを見落としていることを望んでいます。

于 2012-12-14T20:52:20.260 に答える
1

他に何か起こっていないことは確かですか?私はRails 3.0.xプロジェクトを持っていて、パラメータを渡しています..まあ..これは投稿です..getとは違うかもしれませんが、それは奇妙に思えます..

before  { post :contact_us, :contact_us => {:email => 'joe@example.com',
         :category => 'Category', :subject => 'Subject', :message => 'Message'} }

上記は、 paramsオブジェクトのコントローラーで確実に使用されています。

于 2012-12-13T21:12:19.087 に答える