Ruby on rails 需要帮助排除失败的Rspec测试-参数错误:日期与nil的比较

Ruby on rails 需要帮助排除失败的Rspec测试-参数错误:日期与nil的比较,ruby-on-rails,ruby,testing,rspec,Ruby On Rails,Ruby,Testing,Rspec,我正在尝试对Rspec中的测试进行故障排除。我的程序代码按预期工作,但测试代码中有一个问题。相关rspec包括: it "is invalid without a date" do appointment = FactoryGirl.build(:appointment, date: "") appointment.valid? expect(appointment.errors[:date]).to include("can't be blank") end Rspe

我正在尝试对Rspec中的测试进行故障排除。我的程序代码按预期工作,但测试代码中有一个问题。相关rspec包括:

it "is invalid without a date" do
  appointment = FactoryGirl.build(:appointment, date: "")      
  appointment.valid?
  expect(appointment.errors[:date]).to include("can't be blank")
end
Rspec生成以下错误:

Failure/Error: appointment.valid?
 ArgumentError:
   comparison of Date with nil failed

错误似乎是由于我将日期字段留空以测试场景造成的(即,没有日期无效)。如果将date设置为nil或留空会产生错误,那么如何使用Rspec正确测试此场景?我研究了错误消息,但没有找到解决方案。处理此问题的最佳方法是什么?

您的验证方法是将
日期
进行比较,因此出现错误。我无法解释您传入的空字符串在哪里被强制为
nil
,但您也无法将
日期
与字符串进行比较。您需要修改验证方法以适应所有潜在的
date
值和/或将其他验证放在前面(例如
presence:true
)。一旦您这样做,您的测试应该能够运行。

这是因为您的其他验证:

validate :past_dated_appointment

private 

def past_dated_appointment
  if Date.current > self.date
    errors.add(:date, "can't be in the past")
  end
end
您可能应该首先检查日期是否存在:

if self.date && Date.current > self.date

你能发布约会模型的相关部分吗(验证等)?Dylan-我的约会模型包含以下与日期相关的验证:验证:日期,:开始时间,:结束时间,:成员,:培训师,状态:true并且您的模型中没有与
:date
字段相关的其他代码,如保存前或验证前过滤器?没有保存前或验证前过滤器。但是,我确实有这个验证,它作用于日期字段:validates:starts_at,:ends_at,:overlap=>{:exclude_edges=>[“starts_at”,“ends_at”],:scope=>“date”,:scope=>“starts_at”,:scope=>“trainer_id”}这是否相关?起初我没有把它包括在内,因为我认为它不相关。我道歉!在我的上一篇文章中,我忽略了另一个与日期相关的验证。我“注释掉”了验证和Rspec通过。下面是验证,这可能会给Rspec带来一个问题:验证:过去的约会私人定义过去的约会如果Date.current>self.Date错误。添加(:Date,“不能在过去”)结束Dylan和Peter:谢谢你们两个。。。我决定放弃我现有的方法,使用Validate\u的验证助手。下面是我所做的:验证\u date:date、:on=>:create、:on\u或\u after=>:今天这个更改在我的程序中起作用,Rspec很高兴:以前失败的测试现在通过了!我感谢你们的两个回复,因为它们帮助我加深了对Rails的理解,尤其是nil和Date对象的工作原理。我会给两个答案一个要点。谢谢