どうした?
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を返します。