Deviseを使ってユーザー認証部分を作っている訳ですが、テストのときにログインできるユーザーを作っておく必要がありますね。そこで私はspec/support/user_helper.rbを作って、いろんな権限のユーザーを作るメソッドを定義しています。
def build_user_func(user_sym, options={})
options = {
foo: 'default',
bar: 'default'
}.merge(options)
FactoryGirl.build user_sym, options
end
def create_user_func(user_sym, options={})
user = build_user_func(user_sym, options)
user.confirm!
user
end
def create_user
create_user_func(:user, foo: 'other')
end
まぁ簡単に書くとこんな感じにしているんですが、user.confirm!しておかないとメールアドレスの確認が終わってないということでログインできないんですよ。で、!マークのメソッドだから保存されます。saveしてまたconfirm!するのも冗長かと思って、これでユーザー作っちゃえばいいやと思ってそうしてたんですが、confirm!メソッドはvalidationしないんです。before_validationの処理を追加してようやく気付きました。
というわけで直しました。
def create_user_func(user_sym, options={})
user = build_user_func(user_sym, options)
user.save! # 追加
user.confirm!
user
end
こんなの踏み抜くパターンは滅多にないと思いますが、情報共有として残しておきます。
追記:
user.save!をすると、メールアドレス確認メールが飛ぶという罠があったので、email-specの動作で問題が出てました。ので、以下のように修正。
def create_user_func(user_sym, options={})
user = build_user_func(user_sym, options)
user.skip_confirmation!
user.save!
user
end
これでOK。
