我有一个验证,涉及检查将来是否compdate
字段。 compdate
字段的类型为date。对此的自定义验证如下所示:
class Game
validate :compdate_not_in_future
def compdate_not_in_future
return if compdate.nil?
return unless compdate.future?
errors.add(:compdate, 'cannot be in the future')
end
end
我用这样的rspec测试进行了测试。
it { expect(build(:game, compdate: Date.today).valid?).to be true }
it { expect(build(:game, compdate: 1.day.from_now.to_date).valid?).to be true }
这些测试可能会失败,具体取决于一天中的时间。我怀疑这是由于我的时区与UTC的关系造成的。我该如何测试并更正验证程序,以便无论用户处于哪个时区,它都能按预期工作,例如如果用户输入其时区中的今天的日期,则验证将通过;如果日期大于其时区中的今天,则验证将失败。
答案 0 :(得分:0)
基于添加到问题和此post的评论,我提出了以下解决方案。
我介绍了一种方法match_zone
,该方法具有玩游戏的时区。然后,该类开始了
class Game
validate :compdate_not_in_future
def compdate_not_in_future
return if compdate.nil?
Time.use_zone(match_zone) do
return unless compdate.future?
end
errors.add(:compdate, 'cannot be in the future')
end
end
测试是这样的:
it { expect(build(:game, compdate: Time.use_zone(match_zone) { Date.current }).valid?).to be true }
it { expect(build(:game, compdate: Time.use_zone(match_zone) { Date.current + 1.day}).valid?).to be true }