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?
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
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
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
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