TimeCop 未在模型方法中调整时间

TimeCop not adjusting time in model method

提问人:daveasdf_2 提问时间:10/27/2023 最后编辑:daveasdf_2 更新时间:10/27/2023 访问量:47

问:

使用 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 在模型方法中调整时间。

Ruby-on-Rails rSpec 水豚 Timecop

评论

0赞 max 10/27/2023
我的猜测是您的规范没有在同一进程中运行。每当不为存根或您可以使用的测试模式提供某种实用程序时,它就不会提供吗?
0赞 daveasdf_2 10/27/2023
我很感激,ty。...按cron_log.log(如果我将其设置为每 1 分钟运行一次),Cron 会立即启动,甚至在创建 FactoryBot 实例之前很久。然后创建 FactoryBot 实例,然后 TimeCop 到达现场,毫无用处。我是业余爱好者,但我认为这必须是一个标准的场景吗?如何测试由 cron 作业启动的代码?
0赞 daveasdf_2 10/27/2023
...有一个 whenever-test gem,它“这个 gem 实现了一个类,该类与 Whenever gem 具有相同的 DSL 接口。它基本上针对 Whenever::Test::D SLInterpreter 运行 schedule.rb 文件,并存储找到的所有语句和参数,以便您可以在测试中轻松查询它们。不允许我在未来触发 cron 作业,我不认为。
0赞 aridlehoover 10/27/2023
我不清楚你想在这里测试什么。您是否正在测试 cron 是否在您预期时触发?(如果是这样,为什么?或者,你是否在测试你的业务逻辑?(如果不是,为什么?
0赞 daveasdf_2 10/27/2023
Ty - 我正在尝试弄清楚如何在测试环境中根据提示触发 cron,以便我可以测试各种 cron 作业启动的代码。有些 cron 每天开火一次,有些每月开火一次,等等,所以我希望将 TimeCop 设置为在正确的时间旅行,略早于 Cron 的安排。

答: 暂无答案