提问人:daveasdf_2 提问时间:10/27/2023 最后编辑:daveasdf_2 更新时间:10/27/2023 访问量:47
TimeCop 未在模型方法中调整时间
TimeCop not adjusting time in model method
问:
使用 Rails、rspec、FactoryBot、Capybara、Whenever、TimeCop。
我尝试在 Rspec/Capybara 测试期间在“00:01,每 1.day”(每天凌晨 12:01)触发模态方法,以测试在 Cron 中触发的代码。我正在尝试 TimeCop 回到当天的 00:00:30,以触发计划在 00:01 发生的 cron。
从本质上讲,我需要弄清楚如何在测试环境中根据提示触发 cron,这样我就可以测试各种 cron 作业启动的代码。有些 cron 被安排为每天一次,有些是每月一次,等等,所以我希望将 TimeCop 设置为在正确的时间旅行,稍微早于 Cron 计划,这样我就可以启动 cron 作业并在 Rspec 中测试代码。
Rspec(将 TimeCop 时间设置为当天凌晨 12:01):
let (:time_travel) do
new_time = Time.local(Time.new.year, Time.new.month, Time.new.day, 0, 0, 30)
Timecop.travel(new_time)
end
问题是,cron 没有触发计划在 00:01 进行的 cron,我认为这是因为在 TimeCop 穿越时间之前,模态方法在运行时被解释,因为如果我每 1.minute 运行一次 cron,并将其放入模态方法中:
模态方法代码:
def self.transfer_to_host
puts "1 ========#{Time.now} --- Time.now (local)"
puts "2 ========#{Time.now.utc} --- Time.now (utc)"
cron_log.log显示计算机的本地时间(不是 TimeCop 时间):
1 ========2023-10-26 10:00:06 -0400 --- Time.now (local)
2 ========2023-10-26 14:00:06 UTC --- Time.now (utc)
但是,如果我在 Rspec 中绑定.pry,它会显示 TimeCop 时间:
[1] pry(#<RSpec::ExampleGroups::HPETRANSFER>)> Time.now
=> 2023-10-26 00:00:47 -0400
如何让 TimeCop 到达 schedule.rb 并HostPublicEvent.transfer_to_host,以便它们在 00:01 触发?
Schedule.rb(无论何时)
every 1.day, :at => '00:01' do
runner "HostPublicEvent.transfer_to_host", :environment => 'test'
end
Rspec:
describe "HPE TRANSFER ", type: :system do
let (:time_travel) do
new_time = Time.local(Time.new.year, Time.new.month, Time.new.day, 0, 0, 30)
Timecop.travel(new_time)
end
....
scenario "MONEY TRANSFER TO HOST AFTER A WEEK", :js => true do
...
...
time_travel
visit root_path
sleep 1
click_on "I agree"
binding.pry
我不确定如何让 TimeCop 在模型方法中调整时间。
答: 暂无答案
评论