ActiveSupport::TestCase は minitest を使っていて、minitest/mock には定数をスタブ化する機能はない。adammck/minitest-stub-const ってのはあるけど、外部ライブラリ入れるほどじゃないよねって場合があるかもしれない。
そんな時はこんな感じのコードでいいんじゃないかな?
こういうトリッキーなのは最終手段的なもので、定数を環境ごとに設定ファイルに定義できるような gem を使うべきだとは思う。
やってみたらできたというお話
ActiveSupport::TestCase は minitest を使っていて、minitest/mock には定数をスタブ化する機能はない。assert_difference がありますね。test 'ユーザーが確認済みになること' do assert_not user.confirmed? # ここに承認処理 assert user.confirm? endそれならば、こんなメソッドを test_helper あたりに定義しておいて
test 'ユーザーが確認済みになること' do
assert_change 'user.confirmed?' do
# ここに承認処理
end
end
# 実際の値を気にしなくていいならこんな使い方も
test '保存したら updated_at が更新される' do
assert_change 'user.updated_at' do
user.save
end
end
と書くとちょっとスッキリしますね。コードはほぼほぼ assert_difference のパクリです。expression の指定方法は必要になったら広げる感じでいいかな。
dragoverを補足してキャンセルしておかないとdropイベントを補足してくれなかったのにハマったconfig/initializers/devise.rb はこんな感じとする。
Devise.setup do |config| # 省略 config.reset_password_within = 30.minutes config.confirm_within = 30.days # 省略 endテストコードはこんな感じでかけた。 Recoverable では
reset_password_sent_at と reset_password_within.ago を比較している。ActiveSupport::Duration#agoまで遡ると初期値である Time.current に対して演算していたので、最初は Time.stub(:current, ... のようにしていた。Time.now と比較している。そのため、Time.current は通らないのでこのやり方ではだめだった。Time.now をスタブ化したらよかったわけだが、こういう同質的な処理は同じ書き方をしてほしいなーとおもった昼下がり。
skip_reconfirmation! を使用する。
なお、新規作成時に確認手順を飛ばしたい場合は skip_confirmation! を使う。