首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Factory_girl的Timecop :工厂,而不是预期的排序日期属性

使用Factory_girl的Timecop :工厂,而不是预期的排序日期属性
EN

Stack Overflow用户
提问于 2016-09-07 15:06:40
回答 1查看 724关注 0票数 2

我正在使用蒂米科 gem来存根日期。我也在使用女孩,以便更容易地为我的规范创建对象。

这是我的工厂:

代码语言:javascript
复制
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日。

这是我的规格:

代码语言:javascript
复制
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

当规范运行时,这里是输出:

代码语言:javascript
复制
Today's frozen date thanks to Timecop: 01/01/2010
Sequenced Date: 09/30/2017

在第一个输出行中: Timecop在我调用Date.today时按预期工作。它成功地冻结了时间,并返回了冻结的时间。

然而:第二行不像预期的那样工作。显然,它使用的是系统Date,而不是Timecop的冻结Date。排序的end_date应该顺序地将+1年添加到当前冻结的日期。因此:我希望这里的end_date09/30/2011,而不是09/30/2017

如何使排序的end_date属性离开Timecop的Date而不是系统的Date

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-07 16:41:13

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

代码语言:javascript
复制
trait(:sequenced_end_date) {sequence(:end_date, Date.today.year + 1)  {|n| Date.new(n, 9, 30) }}

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

我只需将这些方法更改为:

代码语言:javascript
复制
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) }}

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

代码语言:javascript
复制
Today's frozen date thanks to Timecop: 01/01/2010
Sequenced Date: 09/30/2011

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39373472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档