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! を使う。
has_many のオプションがあります。
Rails4では order と include が使えなくなってるんですね。App 21863 stderr: [ 2015-11-06 12:37:20.3972 21881/0x007f1632a022e8(Worker 1) utils.rb:84 ]: *** Exception RuntimeError in Rack application object (Missing `secret_token` and `secret_key_base` for 'production' environment, set these value s in `config/secrets.yml`) (process 21881, thread 0x007f1632a022e8(Worker 1)):
config/secrets.ymlによると、本番環境ではENV["SECRET_KEY_BASE"]を読み込むらしい。ENV["FOO_SECRET_KEY_BASE"]のようにアプリごとに環境変数変えたらいいのかな?とおもって調べてみると、apacheの設定ファイルで SetEnv すればよいらしい。
# /etc/apache2/sites-available/foo-app.conf
<VirtualHost *:80>
ServerName foo-app.mkt-sys.jp:80
DocumentRoot /var/lib/rails/foo-app/public
<Directory /var/lib/rails/foo-app/public/>
SetEnv SECRET_KEY_BASE abcdefg...xyz #←ココ
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
PassengerEnabled on
</VirtualHost>
設定するキーは bunde exec rake secret RAILS_ENV=production で出力されたものをコピペ。(多分 RAILS_ENV=productionはいらないだろうけど)
bundle gem -t とすると自動的に spec フォルダと .rspec が作成された。spec.add_development_dependency 'test-unit' を追加し、Rakefile にこんな感じに設定を書くだけだった。
==のオーバーライドだけでは足りず、eql?とhashのオーバーライドが必要だった。