webentwicklung-frage-antwort-db.com.de

Stubbing Time.now mit RSpec

Ich versuche, Time.now in RSpec wie folgt zu ersetzen:

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

Ich bekomme dabei folgende Fehlermeldung:

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

Irgendeine Idee, warum das passieren könnte?

17
Patrick Kayongo

Abhängig von Ihrer RSpec-Version möchten Sie möglicherweise die neuere Syntax verwenden:

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

Siehe RSpec Mocks 3.3

35
spickermann

Sie können timecop verwenden. Die Zeit vor dem Test einfrieren und danach wieder auftauen.

describe "some tests" do
  before do
    Timecop.freeze(Time.now)
  end

  after do
    Timecop.return
  end

  it "should do something" do
  end
end

oder definieren Sie eine bestimmte Zeit mit

let(:time_now) { Time.now }

und in Timecop.freeze(time_now) und in Tests verwendet

2
mmsilviu

Sie können immer timecop verwenden:

@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

travel_to aus ActiveSupport könnte dem Zweck besser dienen und könnte wie folgt aussehen:

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