Skip to content

Instantly share code, notes, and snippets.

@pencilcheck pencilcheck/_README.md forked from shime/_README.md
Last active Jun 18, 2018

Embed
What would you like to do?

What is this?

How do you compare date/times in RSpec?

If you do this

expect(Time.now.to_i).to eq Time.new(2014, 4, 2).to_i

and you usually use more human format of expressing time, than just spitting out the miliseconds since January 1, 1970 - I've got some bad news for you.

Have you ever wondered what does this mean?

1) time comparison doesn't pass for different time
     Failure/Error: expect(Time.now.to_i).to eq Time.new(2014, 4, 2).to_i
       
       expected: 1396389600
            got: 1396430562

Yes, me too - these miliseconds are not that expressive...

With this gist, that will change into:

  1) time comparison doesn't pass for different time
     Failure/Error: expect(Time.now).to be_the_same_time_as Time.new(2014, 4, 2)
       expected 2014-04-02 11:28:41 +0200 to be the same time as 2014-04-02 00:00:00 +0200

Much nicer, right?

Don't believe me?

Run this

bash < <( curl -fsSL https://gist.githubusercontent.com/shime/9930893/raw/try.sh )

Trust me, I'm just a random guy from the interwebz!

RSpec::Matchers.define :be_the_same_time_as do |expected|
match do |actual|
expect(expected.strftime("%Y-%m-%dT%H:%M:%S%z").in_time_zone).to eq(actual.strftime("%Y-%m-%dT%H:%M:%S%z").in_time_zone)
end
end
describe "time comparison" do
it "passes for equal dates" do
expect(Time.new(2014, 4, 2)).to be_the_same_time_as Time.new(2014, 4, 2)
end
it "passes for equal time" do
expect(Time.now).to be_the_same_time_as Time.now
end
it "doesn't pass for different time" do
expect(Time.now).to_not be_the_same_time_as Time.new(2014, 4, 2)
end
end
curl -fsSL https://gist.githubusercontent.com/shime/9930893/raw/example_spec.rb > /tmp/example_spec.rb
rspec -c /tmp/example_spec.rb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.