日付をスタブアウトするためにtimecopの宝石を使用しています。私はまた、factory_girlを使用して、仕様のオブジェクトを簡単に作成しています。ここでFactory_girlを使用したTimecop:日付の属性がシーケンスされていない可能性があります。
は私の工場で:
FactoryGirl.define do
factory :fiscal_year do
start_date {Date.today}
end_date {Date.today + 1.day}
trait(:sequenced_start_date) {sequence(:start_date, Date.today.year) {|n| Date.new(n, 10, 1) }}
trait(:sequenced_end_date) {sequence(:end_date, Date.today.year + 1) {|n| Date.new(n, 9, 30) }}
factory :sequenced_fiscal_year, parent: :fiscal_year,
traits: [:sequenced_start_date, :sequenced_end_date]
end
end
は、今日の実際日は2016年9月7日であると仮定します。ここで
は私のスペックです:
RSpec.describe FiscalYear, type: :model do
before(:example) do
Timecop.freeze(Time.local(2010))
end
after do
Timecop.return
end
describe "fake spec to show unexpected sequence behavior" do
it "tests something" do
puts "Today's frozen date thanks to Timecop: #{Date.today}"
fiscal_year = create(:sequenced_fiscal_year)
puts "Sequenced Date: #{fiscal_year.end_date}"
end
end
end
スペックが、ここで実行されると出力されます:最初の出力ラインで
Today's frozen date thanks to Timecop: 01/01/2010
Sequenced Date: 09/30/2017
:私はDate.today
を呼び出すときTimecopは期待通りに動作します。それは時間を凍結させ、その凍った時間を返します。
ただし、2行目が期待どおりに動作しません。 TimecopのフリーズしたDate
とは対照的に、システムDate
を使用していることは明らかです。シーケンス番号end_date
は、現在凍結された日付に+1年を順次追加する必要があります。したがって、09/30/2017
ではなくが09/30/2011
であると私は期待しています。
シーケンスend_date
の属性が、システムのDate
ではなく、TimecopのDate
になるようにするにはどうすればよいですか?
yep - ちょうど同様のことを言うつもりだった。 'Date.today.year'は初期化時に問題となる実行時よりも評価されます。 – Anthony
@Anthonyは訂正してくれてありがとう。私はそれをより正確に変更します。 – Neil