Deviseを使ってテストしてるときだけvalidationが動かなかった件

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。


カテゴリー Ruby, Ruby on Rails | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です