2017-05-30 91 views
2

我想了解什么格式:atActiveJob是,这样我就可以使用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参数,我宁愿用它代替块中最后两行。问题是,tomorrow变量似乎是在不同的格式:at,这使得这个失败:

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

与此错误:

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

你想在'Float'比较,基本上是有很多缺点的下沉我怀疑一个例子。我强烈建议坚持你现在拥有的东西,因为比较'日期'对于测试目的来说更强大,然后比较_milliseconds_。 OTOH,':at'参数可能是'tomorrow'之前的任何内容,所以可以使用'Date.tomorrow.noon'等,如[Rails docs]中所示(http://api.rubyonrails.org/classes/ActiveJob /TestHelper.html#method-i-assert_enqueued_with)。 – mudasobwa

+0

你能告诉我'start_onboarding'如何排队工作吗 – Anthony

+0

@Anony'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',并且只在明天增加一小时并不能解决这个问题,因为我认为时区差异... –

+0

嗯即使我获得相同的时间,它也是仍然不等于... 'tomorrow.to_time == Time.at(job_date)',都是'Time'类,都是'2017-05-31 15:33:38 + 0100' –

+0

好吧,好像这是因为花车不是一样的。我没有看到让他们完全一样的方式,这只是浪费时间。任何想法如何没有这样严格的比较? –

1

选项应该是一个时间。

看到文档here