2016-04-14 3 views
1

私はHartlの演習をchapter 9に行っており、の統合テストの作成については、が必要です。Railsの統合テストの構文 - get:edit vs get edit_user_path

私は9.17(i)をリストすると、9.14(II)を使用していますリストのに対し

get :edit, id: @user 

を使用していることに気づく:

get edit_user_path(@user) 

違いは何ですか?ログインしていないユーザがホームページにリダイレクトされるのをテストする目的で、後者は動作しますが、前者はエラーを投げます。

概念的には、同じような外観上の二つの文、I)II一方、コントローラのアクションを呼び出します)リソース

へのルートがあることは正しいですか?

答えて

2

実際、2つのコードは概念的に同等です。

GETの要求をusers/edit.html.erbに送信し、editのアクションをUserscontrollerに送信して、同じことを行っています。

ただし、上記の動作をテストするコンテキストは異なります。


コード

get :edit, id: @user 

コントローラ(UsersController)をテストのコンテキストです。したがって、アクション(この場合は「edit」)と必要なパラメータ(この場合は「id」)を指定するだけで済みます。

get edit_user_path(@user) 

は、ユーザーがあなたのアプリをブラウジングして、統合テストで行うことができるようになっています。ここでは、異なるコントローラが関わっている可能性があるため、ルーティングパスについて正確にする必要があります。つまり、アクションが呼び出されるコンテキストは、特定の1つのコントローラに限定されません。 は、例えば、Listing 8.40に、私たちがログアウトユーザーシミュレートし、統合テストがあります。この統合テストで

test "login with valid information followed by logout" do 
    get login_path 
    post login_path, session: { email: @user.email, password: 'password' } 
    assert is_logged_in? 
    assert_redirected_to @user 
    follow_redirect! 
    assert_template 'users/show' 
    assert_select "a[href=?]", login_path, count: 0 
    assert_select "a[href=?]", logout_path 
    assert_select "a[href=?]", user_path(@user) 
    delete logout_path 
    assert_not is_logged_in? 
    assert_redirected_to root_url 
    # Simulate a user clicking logout in a second window. 
    delete logout_path 
    follow_redirect! 
    assert_select "a[href=?]", login_path 
    assert_select "a[href=?]", logout_path,  count: 0 
    assert_select "a[href=?]", user_path(@user), count: 0 
    end 

を、関与する2つのコントローラがあります。UsersControllerSessionsController。具体的に

assert_select "a[href=?]", user_path(@user)

  • user_path(@user)UsersControllershowアクションについてです。
  • login_pathget login_pathは、 SessionsControllernewアクションを呼び出します。 post login_path, session: { email: @user.email, password: 'password' }

  • login_pathSessionsControllercreateアクションを呼び出します。

  • login_pathassert_select "a[href=?]", login_pathは、約の作用であり、SessionsControllerである。
  • logout_pathassert_select "a[href=?]", logout_pathは、 約destroyの作用であり、SessionsControllerである。

これは、いくつかのアクションを呼び出すときに特定のコントローラに限定されていないため、統合テストでは可能です。あなたは

get :edit, id: @user 

を提供する最初のコードは、統合テストでエラーがスローされますなぜ

これも説明しています。 アクションが呼び出されたコントローラーがコントローラで指定されていません。 )

また、ポイントは私は)II一方、コントローラのアクションを呼び出す

を上げリソース

へのルート(これは例えば、 AccountActivationsController又は PasswordResetsControlleredit作用することができます)

が重要です。

コントローラテストは純粋に、コントローラに「低レベル」または「マシンレベル」のコマンドを発行することでテストします。つまり、あなたのアプリをブラウズしているユーザーをシミュレートすることを心配することなく(実際には「プロフィールの編集」リンクをクリックしているユーザー)、特定のHTTPリクエスト(あなたの場合はPATCH)をコントローラのアクション(edit)に直接送信します。より多くの「高レベル」の統合テストを行います。

関連する問題