2017-02-27 3 views
2

私はRuby on Rails 5.0.1で初めてユニットテストを試しています(テストなしで数回設計されたサイトですが、適切なテストの価値を理解し始めたばかりです...)物事のハングアップ。私はルーティングが正しく動作することを確認するためにいくつかのテストを書いています。Railsがリダイレクトで3XXを与えず、単体テストが失敗するのはなぜですか?

テスト/コントローラ/ static_page_controllers_test

require 'test_helper' 

class StaticPagesControllerTest < ActionDispatch::IntegrationTest 
    test "root should get static_pages home" do 
    get '/' 
    assert_redirected_to static_pages_home_url 
    end 

    test "static_pages root should get static_pages home" do 
    get '/static_pages' 
    assert_redirected_to static_pages_home_url 
    end 

    [some other tests] 

end 

私はstatic_pageshome埋め込まれたルビーhtmlファイルへのルートとstatic_pagesルートからリダイレクトするために、いくつかのルーティングコードを書かれています。このコードは、ブラウザが/static_pagesまたは/の場合は、static_pages/home.html.erbページが読み込まれるという意味で、正しくリダイレ​​クトされます。

アプリ/設定/ routes.rbを

Rails.application.routes.draw do 
    get '/static_pages' => 'static_pages#home' 
    get 'static_pages/home' 
    get 'static_pages/help' 
    get 'static_pages/about' 
    root 'static_pages#home' 
end 

私は、彼らがまだ失敗しているリダイレクトのための私のユニットテストを実行。ルートURLに

rails test

# Running: 

F 

Failure: 
StaticPagesControllerTest#test_root_should_get_static_pages_home [/home/ubuntu/workspace/sample_app/test/controllers/static_pages_controller_test.rb:6]: 
Expected response to be a <3XX: redirect>, but was a <200: OK> 


bin/rails test test/controllers/static_pages_controller_test.rb:4 

..F 

Failure: 
StaticPagesControllerTest#test_static_pages_root_should_get_static_pages_home [/home/ubuntu/workspace/sample_app/test/controllers/static_pages_controller_test.rb:11]: 
Expected response to be a <3XX: redirect>, but was a <200: OK> 


bin/rails test test/controllers/static_pages_controller_test.rb:9 

. 

Finished in 0.821392s, 6.0872 runs/s, 6.0872 assertions/s. 

5 runs, 5 assertions, 2 failures, 0 errors, 0 skips 

迅速wgetはRailsのプーマサーバが代わりに300ドのHTTP 200を返して確認し、私は手動でHTTPを変更する必要が自分自身または私は取り扱いしていますを要求何らかの方法で間違ってリダイレクトしますか?私の単体テストが正しく動作し、サーバーが適切なHTTPステータスコードを返すようにこれを変更するにはどうすればよいですか?

答えて

0

問題は、これらが実際のHTTPリダイレクトではないということです。 rootroutes.rbに設定してから"/"にアクセスすると、最初にページに行きません。次に、別のページにリダイレクトする必要があることをコードで伝えられます。に直接ルート/ホームページ。

"/static_pages"地図(リダイレクトされていない)を"static_pages#home"に設定すると同じことが起こります。何が起こっているのは、誰かが"/static_pages"に行ったときにStaticPagesControllerが応答する、具体的には#homeメソッドであることをRailsサーバが知っていることです。リダイレクトは起こっていません。

0

HTTPプロトコルのスラングのようにリダイレクトされないためです。あなたは適切に定義されたルートを使用しているだけで、200 OKを取得しています。

See Rails routing guide

+0

'get/static_pages 'に修正すると:redirect(' static_pages/home ')'はドキュメントごとに2番目のテストをパスします。しかし、リンクされたdocにリストされている 'to:redirect'で' root'を使う方法はないようです。 'root 'の代わりに' get/'を使うことができます。これは、読みやすさが少し劣ることを除けば、副作用を引き起こす可能性がありますか? –

+0

@RailsKiddieあなたのテストはあなたを誤解していると思います。リダイレクトを実行するために特殊な構文を使用する必要があることを示すガイドをリンクしましたが、本当に必要な/必要とは思わないと思います。 [あなたは別のアサーションを試すことができます](http://api.rubyonrails.org/classes/ActionDispatch/Assertions/RoutingAssertions.html#method-i-assert_routing) – Tom

+0

はい、あなたはテストについて正しいです、これは本当に役に立つコメント。 –

関連する問題