如何让Factory Girl创建日期?

10

更新 我正在尝试使用Factory Girl来填写我的“发布日期”字段,需要一个日期、一个随机日期,实际上现在只要有一个日期就行了,因为当我运行我的item_pages_spec.rb时,我一直得到“验证失败:发布日期不能为空”错误。

在下面的帮助之后,这是我在item页面的factories.rb中拥有的内容,但是我现在已经尝试了很多不同的东西。

  factory :item do
    sequence(:name)  { |n| "Item #{n}" }
    release_date { rand(1..100).days.from_now }
  end

理想情况下,每个工厂制造的物品实例都应该创建不同的随机日期。
由于在我的物品模型中使用了“validates :release_date, presence: true”,因此发布日期不能为空。理想情况下,我希望在那里有一个验证,确保提供的任何日期都是日期格式,但也接受NIL,因为我并不总是有可用的日期。
非常感谢您的任何帮助。我在网上找不到关于factory girl和日期的具体信息。
模型
class Item < ActiveRecord::Base
validates :name, presence: true, length: { maximum: 50 }
validates :release_date, presence: true

end

Item_pages_spec.rb

    require 'spec_helper'

describe "Item pages" do

  subject { page }

 describe "Item page" do
   let(:item) { FactoryGirl.create(:item) }
   before { visit item_path(item) }

   it { should have_content(item.name) }
   it { should have_title(item.name) }
 end
end

release_date { rand(1..100).days.from_now } 这里可以插入任何范围到 rand 函数中。顺便说一下,请阅读文档 - j03w
我已经阅读了文档并尝试了其中的一些解决方案。似乎问题出在我的验证器上,因为您的解决方案和下面的解决方案都无法通过我的测试。我将不得不寻找更好的替代方案来替代“validates "release_date, presence: true"”,因为我相信你们两个的解决方案都应该是有效的。谢谢。 - Ossie
能否把你的模型和测试代码的一部分贴出来? - j03w
2个回答

9

Faker宝石有一个非常好的方法来实现这一点:

Faker::Date.between(2.days.ago, Date.today) 

4
这将设置一个从现在到未来两年之间的日期,如果需要,请调整参数(或提取方法):
factory :item do
  sequence(:name)  { |n| "Item #{n}" }
  release_date do
    from = Time.now.to_f
    to   = 2.years.from_now.to_f
    Time.at(from + rand * (to - from))
  end
end

看起来很不错,但仍然出现“发布日期不能为空”的错误。非常困惑。我猜这意味着我的问题在别处。 - Ossie
我写的工厂是有效的,无法确定为什么你的验证器会报错。 - apneadiving

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接