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!
を使う。