1

このテストでサインイン/サインアウト方法をテストしたい:

テスト/コントローラー/sessions_controller_test.rb

class SessionsControllerTest < ActionController::TestCase
  fixtures :users
  include SessionsHelper

  test "should signin and signout" do
    get :new
    assert_response :success
    post :create, email: users(:alex).email, password: 'qwerty'
    assert_redirected_to profile_url
    assert cookies[:remember_token]
    assert current_user == users(:alex), 'Ooops! Wrong current_user!'

    delete :destroy
    assert_redirected_to signin_url
    debugger
    assert !cookies[:remember_token]
 => assert !current_user, 'Ooops! Current_user not nil!'
  end
end

=>ポイントはcookies[:remember_token]なくなっていますが、current_userそれでもusers(:alex)、理由がわかりません。私は列にdelete :destroy並んでいませんでしたか?
統合テストはパスしており、サインアウト機能を備えたブラウザーでのライブ パフォーマンスも効果的です。

セッション コントローラーとヘルパーからのメソッド:

sessions_controller.rb

def destroy
  sign_out
  redirect_to signin_url
end

sessions_helper.rb

def current_user=(user)
  @current_user = user
end

def current_user
  remember_token = User.encrypt(cookies[:remember_token])
  @current_user ||= User.find_by(remember_token: remember_token)
end

def sign_out
  cookies.delete(:remember_token)
  self.current_user = nil
end
4

1 に答える 1

1

私は Sinatra ほど Rails に詳しくありませんが、コントローラーのメソッドをSessionsHelper介して既に含まれているべきではありませんか?helpers

SessionsHelperモジュールをテストに直接含めるということは@current_user、メソッドが関連付けられた 2 つのクラス (コントローラー クラスとテスト クラス) を持つことを意味します。

そのためdestroy、コントローラー ルートのメソッドはそのコピーを処理しますが、テストは独自のものを取得します (これは、共有の Cookie 値を介してデータベースから簡単に入力されます)。コントローラーのdestroyメソッドは、テスト オブジェクトのインスタンス変数を変更しません。

テストでは、おそらくcurrent_user値について直接アサーションを行うべきではなく、Web サーバーの応答から抽出できるデータに依存する必要があります。このテストでは使用しないinclude SessionsHelperでください (ヘルパーの単体テストでは問題ありません)。

于 2013-08-25T19:24:16.657 に答える