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
のオーバーライドが必要だった。