[英]RSpec Stubbing out Date.today in order to test a method
如果当前日期在 1 月 1 日至 8 月 1日之间,我想测试一种遵循一条路径的方法,或者如果当前日期在 8 月 2 日至 12 月 31日之间,则它遵循另一条路径。 例子:
def return_something_based_on_current_date
if date_between_jan_1_and_aug_1?
return "foo"
else
return "bar"
end
end
private
def date_between_jan_1_and_aug_1?
date_range = build_date_range_jan_1_through_aug_1
date_range === Date.today
end
def build_date_range_jan_1_through_aug_1
Date.today.beginning_of_year..Date.new(Date.today.year, 8, 1)
end
如您所见: return_something_based_on_current_date
严重依赖Date.today
,它调用的私有方法也是如此。 这使得在此方法中测试两个路径变得困难,因为Date.today
动态返回当前日期。
出于测试目的:我需要Date.today
返回我想要的静态日期,以便我可以测试每个路径是否正常工作。
问题:有什么方法可以让Date.today
返回我在规范中构成的值? 在测试return_something_based_on_current_date
的规范之后:我希望Date.today
的动态实现回到其通常的实现。 我只需要控制Date.today
来测试这个方法。
将此添加到您的 before block
。
allow(Date).to receive(:today).and_return Date.new(2001,2,3)
我*认为*没有必要取消存根。
我建议您查看 Timecop gem,它允许在给定日期冻结时间。
除了存根当前时间之外,它还允许为给定的测试及时旅行
https://github.com/travisjeffery/timecop
describe "some set of tests to mock" do
before do
Timecop.freeze(Time.local(1990))
end
after do
Timecop.return
end
it "should do blah blah blah" do
end
end
更新
正如安迪在评论中提到的,自 Rails 4.1 以来,有一个辅助方法travel_to
可用
可在此处获得参考: http : //api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html
您可能需要考虑另一种方法,它不需要任何存根——更改公共方法以接受当前日期的参数。
澄清:
更改def return_something_based_on_current_date
到def return_something_based_on_current_date(current_date)
然后更改的所有实例Date.today
到current_date
。 您还需要将current_date
传递给私有方法。
然后在你的测试中,你可以通过任何你想要的作为current_date
。
我处于类似的情况,但我不想安装 gem。 因为我对大于一天的时间间隔感兴趣所以我决定这样做
it 'Creates an event for tomorrow' do
event = FactoryBot.create(:event, :tomorrow)
expect(event.date.day).to eq (Time.now + 1.day).day
end
it 'Creates an event for the next week' do
event = FactoryBot.create(:event, :next_week)
expect(event.date.day).to eq (Time.now + 1.week).day
end
it 'Creates an event for the next month' do
event = FactoryBot.create(:event, :next_month)
expect(event.date.day).to eq (Time.now + 1.month).day
end
所以我只是测试了预期日期,我担心一天中会有特定时间测试会被破坏但我不在乎
从 Rails 4.2 开始, ActiveSupport::Testing::TimeHelpers
模块提供了一种简单的方法来做到这一点:
travel_to(Time.parse("2019-01-19")) do
# your code here
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.