我正在测试我的代码。如果某些字段留空(即pickupdate
& returndate
),则不应创建记录。这在模型中非常清楚地说明了:
validate :custom_validation
def custom_validation
errors[:base] << "Please enter both a pick up date and a return date" if self.pickupdate.blank? || self.returndate.blank?
if self.pickupdate.present? && self.returndate.present?
errors[:base] << "Please enter a pick up date and a return date on or after today" if (self.pickupdate.to_date < Date.today) || (self.returndate.to_date < Date.today)
errors[:base] << "Please enter a return date that is on or after the pick up date" if self.pickupdate > self.returndate
errors[:base] << "Please submit requests with a maximum 2-week duration, we don't have enough lenders at this time to offer long term borrows" if (self.returndate.to_date - self.pickupdate.to_date).to_i > 14
end
end
此外,正在测试的模型规格已经过去了!
但是,我刚刚编写了一个卡住的集成测试,当我在控制台中进行故障排除时,我尝试使用空白pickupdate
创建一个空白{{{ 1}}。然后我在控制台中做returndate
并猜猜是什么??
inspect
通过上面的控制台输出显示记录确实已提交给db。现在这是另一个泡菜。当我进入 (0.1ms) begin transaction
(0.1ms) commit transaction
INSPECT
#<Request id: nil, name: nil, email: nil, items: nil, detail: "i should not be created\r\n", created_at: nil, updated_at: nil, edit_id: nil, heard: nil, pickupdate: nil, returndate: nil, signup_id: 2>
END
并查看rails c
时,我会发现昨天的Request.last
,而不是今天。
我只是想知道这是怎么发生的......因为即使检查有问题而且记录没有提交给db(我的意思是......它甚至没有自己的id ),最重要的是我的测试失败了,因为它继续,好像记录被保存了一样。因此,在某些方面,我在该记录上得到了一个nomethoderror错误。
供参考,控制器代码:
Request
基本上,即使@requestrecord = @signup_parent.requests.build #separate from create, because I need to check on some stuff before saving
if @requestrecord = @signup_parent.requests.create(@requestparams)
...
完全为空,create
动作也会以某种方式返回true。现在我可以通过编写显式检查@requestparams
的包装if语句来解决此问题,因为上面的控制台日志输出中不存在该语句。但是现在我的好奇心被激发了,我试图了解造成这个问题的原因。它是单独的@requestrecord.id
声明吗?我想到了......但那么......一旦我真的打电话给build
那就没关系了吗?