2

Rails 3 でコントローラーをテストするときにルーター パスを使用できないのはなぜですか?

get :newが に変換されることは理解していますが、同じものに変換されないのは{controller: 'sessions', action: 'new'}なぜですか? signin_path例えば:

# routes.rb
match 'signin', to: 'sessions#new'

# sessions_spec.rb
it "renders the 'new' template" do
  get signin_path
  response.should render_template :new
end

プロデュース:

No route matches {:controller=>"sessions", :action=>"/signin"}

get signin_pathアプリケーション内で行うように、ルーター構文を使用してルートをテストする方法があればいいでしょう。{ get: 'http://app.com/signin/' }

4

2 に答える 2

4

私も最初はこれに頭を悩ませました。私がそれをどのように理解しているかを説明してみましょう。

あなたのリーディングラインは次のようになっていると思います:

describe SessionsController do

コントローラーの仕様では、ルーティング システムではなく、コントローラー クラスが対象になります。そのため、それらにつながるルートではなく、コントローラー内の個々のアクション メソッドをテストする必要があります。つまり、ルーティングを変更しても、コントローラーの仕様は引き続き機能するはずです。

したがって、実際にこれを行うべきではありません。

it "renders the 'new' template" do
  get 'http://app.com/signin/'
  response.should render_template :new
end

あなたはこれをしているはずです:

it "renders the 'new' template" do
  get :new
  response.should render_template :new
end

RSpec は、どのルートに到達しようとしているかをどうにかして把握します。何かを失敗すると、ルーティング エラーが発生することに気付きました。

于 2012-10-15T18:46:17.883 に答える
2

これをroutes.rbで試してください

match 'signin' => 'sessions#new', :as => :signin

于 2012-10-15T17:56:38.813 に答える