gpt4 book ai didi

ruby-on-rails - Timecop 与 Factory_girl : factory not sequencing date attribute as expected

转载 作者:数据小太阳 更新时间:2023-10-29 08:59:43 26 4
gpt4 key购买 nike

我正在使用 timecop gem 以剔除日期。我也在使用 factory_girl以便更轻松地为我的规范创建对象。

这是我的工厂:

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

假设今天的实际日期是 09/07/2016。

这是我的规范:

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 按预期工作。它已成功卡住时间并返回卡住的时间。

但是:第二行没有按预期工作。它显然使用系统 Date 而不是 Timecop 的卡住 Date。排序的 end_date 应该按顺序将 +1 年添加到当前卡住的日期。因此:我希望此处的 end_date09/30/2011,而不是 09/30/2017

如何才能使排序的 end_date 属性从 Timecop 的 Date 而不是系统的 Date 开始?

最佳答案

问题出在我传递给 sequence 方法的第二个参数上。该参数是静态的/在初始化时评估。它不是动态的,因此 timecop 没有机会在计算第​​二个参数之前将日期 stub 。

trait(:sequenced_end_date) {sequence(:end_date, Date.today.year + 1)  {|n| Date.new(n, 9, 30) }}

传递给 sequence 方法的第二个参数的 Date.today.year 部分是静态的,并在初始化时求值。它不是动态的,甚至在调用该方法之前就已经对其进行了评估。

我只需要将这些方法更改为以下内容:

trait(:sequenced_year_start_date) {sequence(:start_date)  {|n| Date.new(Date.today.year, 10, 1) }}
trait(:sequenced_year_end_date) {sequence(:end_date) {|n| Date.new(Date.today.year + n, 9, 30) }}

现在它按预期工作并返回以下内容:

Today's frozen date thanks to Timecop: 01/01/2010
Sequenced Date: 09/30/2011

block 是动态的,因此在 block 内调用 Date.today.year + n 使 timecop 有机会在执行此 block 之前首先清除 Date

关于ruby-on-rails - Timecop 与 Factory_girl : factory not sequencing date attribute as expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39373472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com