実際、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つのコントローラがあります。UsersController
とSessionsController
。具体的に
:assert_select "a[href=?]", user_path(@user)
で
user_path(@user)
はUsersController
でshow
アクションについてです。
login_path
get login_path
は、 SessionsController
でnew
アクションを呼び出します。 post login_path, session: { email: @user.email, password: 'password' }
で
login_path
は SessionsController
でcreate
アクションを呼び出します。
login_path
のassert_select "a[href=?]", login_path
は、約の作用であり、SessionsController
である。
logout_path
assert_select "a[href=?]", logout_path
は、 約destroy
の作用であり、SessionsController
である。
これは、いくつかのアクションを呼び出すときに特定のコントローラに限定されていないため、統合テストでは可能です。あなたは
get :edit, id: @user
を提供する最初のコードは、統合テストでエラーがスローされますなぜ
これも説明しています。 アクションが呼び出されたコントローラーがコントローラで指定されていません。 )
また、ポイントは私は)II一方、コントローラのアクションを呼び出す
を上げリソース
へのルート(これは例えば、
AccountActivationsController
又は
PasswordResetsController
で
edit
作用することができます)
が重要です。
コントローラテストは純粋に、コントローラに「低レベル」または「マシンレベル」のコマンドを発行することでテストします。つまり、あなたのアプリをブラウズしているユーザーをシミュレートすることを心配することなく(実際には「プロフィールの編集」リンクをクリックしているユーザー)、特定のHTTPリクエスト(あなたの場合はPATCH
)をコントローラのアクション(edit
)に直接送信します。より多くの「高レベル」の統合テストを行います。