gpt4 book ai didi

ruby-on-rails - Rails - 测试使用 DateTime.now 的方法

转载 作者:行者123 更新时间:2023-12-03 13:33:25 25 4
gpt4 key购买 nike

我有一个使用 DateTime.now 对某些数据执行搜索的方法,我想用各种日期测试该方法,但我不知道如何 stub DateTime.now 也不能让它与 Timecop 一起使用(如果它甚至像那样工作)。

随着时间警察我试过了

it 'has the correct amount if falls in the previous month' do
t = "25 May".to_datetime
Timecop.travel(t)
puts DateTime.now

expect(@employee.monthly_sales).to eq 150
end

当我运行规范时,我可以看到 puts DateTime.now 给出 2015-05-25T01:00:00+01:00但是将 DateTime.now 放在我正在测试的方法中输出 2015-07-24T08:57:53+01:00 (今天的日期)。
我怎样才能做到这一点?

- - - - - - - - - 更新 - - - - - - - - - - - - - - - - --------------------

我在 before(:all) 中设置记录(@employee 等)似乎导致问题的 block 。它仅在 Timecop do 之后完成设置时才有效。堵塞。为什么会这样?

最佳答案

TL;DR : 问题是 DateTime.now被调用 Employee之前 Timecop.freeze在规范中被调用。

Timecop 模拟 Time 的构造函数, DateDateTime .在 freeze 之间创建的任何实例和 return (或在 freeze block 内)将被模拟。
freeze 之前创建的任何实例或在 return 之后不会受到影响,因为 Timecop 不会与现有对象混淆。

来自 README (我的重点):

A gem providing "time travel" and "time freezing" capabilities, making it dead simple to test time-dependent code. It provides a unified method to mock Time.now, Date.today, and DateTime.now in a single call.



所以必须调用 Timecop.freeze在创建 Time 之前你想模拟的对象。如果您 freeze在 RSpec before block ,这将在 subject 之前运行被评估。但是,如果您有 before设置主题的 block (在您的情况下为 @employee),并有另一个 before嵌套 describe 中的 block , 那么你的主题已经设置好了,调用了 DateTime.new在你卡住时间之前。

如果您将以下内容添加到您的 Employee 会发生什么?
class Employee
def now
DateTime.now
end
end

然后运行以下规范:
describe '#now' do
let(:employee) { @employee }
it 'has the correct amount if falls in the previous month', focus: true do
t = "25 May".to_datetime
Timecop.freeze(t) do
expect(DateTime.now).to eq t
expect(employee.now).to eq t

expect(employee.now.class).to be DateTime
expect(employee.now.class.object_id).to be DateTime.object_id
end
end
end

而不是使用 freeze block ,你也可以 freezereturn在 rspec beforeafter钩子(Hook):
describe Employee do
let(:frozen_time) { "25 May".to_datetime }
before { Timecop.freeze(frozen_time) }
after { Timecop.return }
subject { FactoryGirl.create :employee }

it 'has the correct amount if falls in the previous month' do
# spec here
end

end

题外话,但也许看看 http://betterspecs.org/

关于ruby-on-rails - Rails - 测试使用 DateTime.now 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31604596/

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