2016-10-27 15 views
0

私はここで他に多くの質問を読んだことがありますが、私の問題は解決できませんでした。私は誰かが私を助けることができるといいですRails4 - テスト - URLGenerationError:経路が一致しない

私はこのメッセージを取得し、私のコントローラのテストを実行する:

ActionController::UrlGenerationError: No route matches 
    {:action=>"/login", :controller=>"sessions"} 
test/controllers/sessions_controller_test.rb:6:in `block in 
    <class:SessionsControllerTest>' 

rake routesは、次のようになります。

Prefix Verb URI Pattern  Controller#Action 
login GET /login(.:format) sessions#new 
     POST /login(.:format) sessions#create 
logout DELETE /logout(.:format) sessions#destroy 

私のテスト自体は、このいずれかになります。

test "should get new" do 
    puts 'debug: ' + login_path 
    get login_path 
    assert_response :success 
end 

プットのデバッグラインプリント:debug: /login

私は私のウェブブラウザでlocalhost:3000/loginに行くとき、それは正しくページをロードし、デバッグ情報は、それが使用されていることサイス:テストが正しくnewアクションにリダイレクトされていない、代わりに探している理由の任意のアイデアを

controller: sessions 
action: new 

存在しないアクションの場合/login?ありがとう!

EDIT:

http://blog.bigbinary.com/2016/04/19/changes-to-test-controllers-in-rails-5.html

(私が使用している)Rails4上のコントローラのテストがActionController::TestCaseget :new必見を使用しています:ソリューション私は全体の問題を説明し、このリンクを見つけたの下に答えを後

get login_urlの代わりに使用してください(統合テストでは問題ありません)。

+0

なぜ、 'get:new'ではなく' get login_path'を使用していますか? – ArtOfCode

+0

https://www.railstutorial.org/book/basic_loginのコードを試してみました。ありがとう! –

+0

チュートリアルのスタイルがうまくいくかどうかは不思議です。 –

答えて

2

試験方法getpostdeleteなど、すべてはあなたがそれらを渡す任意のパラメータがテストされているコントローラ内のアクションの名前であることを前提としています。だから、この呼び出しは動作します:

get :new 

それはurl_for(:controller => :sessions, :action => :new)が生成されるため。この呼び出しはしていません:

get '/login' 

それはurl_for(:controller => :sessions, :action => '/login')が生成されるため。

シンボルフォームを使用してください。

1

URLを使ってこれをテストする正しい方法は、get login_pathの代わりにget login_urlと書くことです。 path変数のみ(パスが付加されますので、あなたがブラウザを介してそれを見たときに動作します)相対パスです/loginを、構成されていて、テストのプロセスは、ブラウザ内で実行されていないため、

です。一方、変数urlはユニバーサルリソースロケータであるため、の絶対パスであり、動作します。

+0

そのようにすれば、 'No route matches {:action =>" http://test.host/login "、:controller =>" sessions "}' –

+0

@PacoAbato Erm、あなたは 'test.host'に精通していますか? –

+0

私はそれがlocalhostだと思います。とにかく失敗したテストです: 'ActionController :: UrlGenerationError:ルートが一致しません{:action =>" http://test.host/login "、:controller =>" sessions "}' –

関連する問題