web-dev-qa-db-fra.com

Stubbing Time.now avec RSpec

J'essaie de stub Time.now dans RSpec comme suit:

it "should set the date to the current date" do
    @time_now = Time.now
    Time.stub!(:now).and_return(@time_now)

    @thing.capture_item("description")
    expect(@thing.items[0].date_captured).to eq(@time_now)
end

Je reçois le message d'erreur suivant:

 Failure/Error: Time.stub!(:now).and_return(@time_now)
 NoMethodError:
   undefined method `stub!' for Time:Class

Une idée pourquoi cela pourrait se produire?

17
Patrick Kayongo

Selon votre version de RSpec, vous voudrez peut-être utiliser la syntaxe la plus récente:

allow(Time).to receive(:now).and_return(@time_now)

Voir RSpec Mocks 3.3

35
spickermann

Vous pouvez toujours utiliser timecop :

@time_now = Time.now

Timecop.freeze(@time_now) do
  @thing.capture_item("description")
  expect(@thing.items[0].date_captured).to eq(@time_now)
end
2
Pedro Nascimento

travel_to from ActiveSupport pourrait mieux servir cet objectif et ressembler à ceci:

def test_date
  travel_to Time.zone.parse('1970-01-01')
  verify
  travel_back
end
1
Artur Beljajev