どうした?
Railsチュートリアルにならって永続ログイン機能を実装しました。
永続ログイン時にはUserモデル内で定義されたクラスにremember_token
というインスタンス変数が付与されます。
本記事は、minitestでそれの有無を調べる方法をメモとして残します。
テスト方法
うまくいかない方法(ログイン時)
assert !@user.remember_digest.nil?
@user
にremember_token
をハッシュ化したremember_digest
が付与されているかどうかを調べれば良いのかなと思いましたが、minitestはこれをfalseで返してきます。
minitestは、モデル内で定義したインスタンス変数にテストの内部からアクセスできません。
これは、インスタンス変数とminitestのスコープが異なるためです。
cookiesにremember_token
が存在するかをチェックする方法
cookiesに保存されたremember_token
の有無を調べる方法です。
assert !cookies[:remember_token].empty?
ログインしていれば、trueを返します。
userがもつremember_token
とcookiesがもつremember_token
が一致するかをチェックする方法
モデル内で定義したインスタンス変数にアクセスするには、assign
というテストハッシュを使用します。
assign(key = nil)
アクションを実行した結果、インスタンス変数に代入されたオブジェクトを取得
これを利用してuserがもつremember_token
がcookiesがもつremember_token
と一致するかをチェックします。
よってテストは以下のようになります。
assert cookies[:remember_token], assigns(:user).remember_token
ログインしていれば、trueを返します。