Automating timecop gem for testing time-dependent Ruby code
RSpec is pretty cool. You can define arbitrary flags to toss at the end of a describe
, it
, context
, etc., to run arbitrary code. This is super handy with timecop, a gem to mock Time.now
, Date.today
, and DateTime.now
.
Instead of doing this:
describe '#do_a_thing' do it 'sets thing_at as now' do Timecop.freeze Thing.do_a_thing expect(Thing.thing_at).to eq Time.now Timecop.return endend
Put this in spec/support/timecop.rb:
RSpec.configure do |config| config.before :each, timecop: :freeze do Timecop.freeze end config.after :each, timecop: :freeze do Timecop.return endend
And do:
describe '#do_a_thing' do it 'sets thing_at as now', timecop: :freeze do Thing.do_a_thing expect(Thing.thing_at).to eq Time.now endend
Doesn't that look nice?