gpt4 book ai didi

ruby-on-rails - ActiveJob :at key 是什么格式

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:39 26 4
gpt4 key购买 nike

我想了解 ActiveJob:at 是什么格式,所以我可以将 assert_enqueued_with:at< 一起使用 参数。

目前我已经通过了这个测试:

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 参数,我更愿意使用它而不是 block 中的最后两行。问题是,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}

如您所见,明天 是一个日期,比如 2017 年 5 月 31 日星期三,而 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

最佳答案

wait_until 方法的参数需要与您的测试使用的相匹配。序列化到队列中的日期确实被 rails 变成了 float 。 .在您的 #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

关于ruby-on-rails - ActiveJob :at key 是什么格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44263566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com