2017-05-30 2 views
2

ActiveJobの形式は:atですので、assert_enqueued_with:atのパラメータを使用できます。 ActiveJobの形式は:

は、現在、私が渡し、この試験持っている:

tomorrow = 1.day.from_now.to_date 
assert_enqueued_with(job: ActionMailer::DeliveryJob) do 
    onboarding.start_onboarding 
    job_date = ActiveJob::Base.queue_adapter.enqueued_jobs[0][:at] 
    assert_equal tomorrow, Time.at(job_date).to_date 
end 

をしかし、私はassert_enqueued_with:atパラメータを持っており、私が代わりにブロック内の最後の2行で、それを使用することを好むだろうと気付きました。このエラーで

tomorrow = 1.day.from_now.to_date 
assert_enqueued_with(job: ActionMailer::DeliveryJob, at: tomorrow) do 
    onboarding.start_onboarding 
end 

:問題はtomorrow変数が、これは失敗します:atとは異なる形式であると思われる、あるあなたが見ることができるように、

Minitest::Assertion: No enqueued job found with {:job=>ActionMailer::DeliveryJob, :at=>Wed, 31 May 2017 13:12:05 UTC +00:00} 

tomorrowが日付で、Wed, 31 May 2017を言います、job_dateは何種類かの大きな数字です(例:1496236366.183789)。したがって私はtomorrowを同じ形式に変換しようとしています。

本当にこの点で助けていただければ幸いです。おそらく私は:atを間違って使用していますか、または:atの形式を知っていて、tomorrowの変換に役立ちます。

start_onboardingは、電子メールの配信をスケジュールするために、このメソッドを呼び出すだけでAASMイベント、(プライバシーの理由のために修飾ビット)である:

def notify(id) 
    person = User.find(id) 
    PersonMailer.onboarding_reminder(person). 
    deliver_later(wait_until: 1.day.from_now) 
end 
+0

の例を参照してください。 'Date'sをテスト目的のためにもっと堅牢にしてから、_milliseconds_を比較するので、現在持っているものに固執することを強くお勧めします。 OTOHの場合、 ':at'パラメータは' tomorrow'の前にあるかもしれないので、[Rails docs](http://api.rubyonrails.org/classes/ActiveJob)に示されているように 'Date.tomorrow.noon'などを使うかもしれません。 /TestHelper.html#method-i-assert_enqueued_with)。 – mudasobwa

+0

'start_onboarding'がジョブをエンキューする方法を教えてください – Anthony

+0

@Anthony' start_onboarding'はAASM gemからのイベントコールですが、実際にメーラーをスケジュールするメソッドを追加しました –

答えて

1

wait_untilメソッドの引数は、あなたのテストを使用するものと一致する必要があります。キューにシリアル化された日付はrailsによって浮動小数点に変換されます。 #notifyメソッドでは、テストがDateインスタンスを通過するときにActiveSupport::TimeWithZoneインスタンスを渡しています。

はこちらをご覧ください:

1.day.from_now 
=> Wed, 31 May 2017 13:56:36 UTC +00:00 
1.day.from_now.class 
=> ActiveSupport::TimeWithZone 
1.day.from_now.to_date 
=> Wed, 31 May 2017 
1.day.from_now.to_date.class 
=> Date 
1.day.from_now == 1.day.from_now.to_date 
=> false 

あなたの仕事は、時間情報をエンキューなっているが、あなたのテストは、単純な日付を期待していることを意味します。私は、どちらのテスト日付が正しいかわからないが、コード日付は合っていますが、合格するためにはこのテストに合致する必要があります。コメントパー

は、ここにあなたがあなたを助けるためにTimecopを使用する場合があります方法は次のとおりです。

tomorrow = 1.day.from_now.to_date 
    Timecop.freeze(tomorrow) 
    assert_enqueued_with(job: ActionMailer::DeliveryJob, at: tomorrow) do 
    onboarding.start_onboarding 
    end 
    Timecop.return 
+0

それは意味があります。しかし、いくつかの不一致が残っています。なんらかの理由で ':at 'は'明日'より1時間早いです。なぜ 'Job'が' +0100'を持っているのか、そして 'tomorrow'に時間を追加するだけで時間帯が違うので、それを修正しない理由はわかりません... –

+0

私は同じ時間を取得しても、それはまだ同じではありません... 'tomorrow.to_time == Time.at(job_date)'、どちらも 'Time'クラスであり、どちらも' 2017-05-31 15:33:38 + 0100' –

+0

です浮動小数点数は同じではないためです。私はそれらをまったく同じにする方法は見当たりませんし、時間の無駄だと思われます。どのようにこのような厳格な比較を持っていない任意のアイデア? –

1

オプションで時間でなければなりません。

は、私はあなたが基本的な欠点をたくさん持っているFloat`比較、 `に沈みたい疑うドキュメント here