我在我的模型Thing上编写我的规范,它的日期字段应该在创建日期之后,因此我使用 validate_timeliness 插件
validate_date :date, :after Time.now
我希望能够添加一些具有前期日期的东西但验证失败。我想在使用 machinist 工厂创建一些东西时绕过验证。
有任何线索吗?
答案 0 :(得分:1)
您的验证不应该确保日期在created_at属性之后吗?而不是Time.now ???
你不应该试图在你的测试中使用无效数据,你可能应该做的是在时间上创建软糖。
@thing = Thing.make(:created_at => 1.day.ago)
在您的规范中尝试过去时间的唯一理由当然应该是测试验证确实有效..
@thing = Thing.make_unsaved(:date => 1.day.ago)
@thing.should have(1).error_on(:date)
你有没有理由这样做?你想测试什么?
答案 1 :(得分:0)
如果使用布尔参数= true调用your_obj.save,请执行以下操作:some_obj.save!(true)
,否则将跳过所有验证。这可能是我公司广泛使用的无证ActiveRecord功能:)
答案 2 :(得分:0)
class Thing
def before_validation
self.date = 1.hour.from_now
end
end
答案 3 :(得分:0)
您可以捕获验证引发的异常。如果在需要机械师之后需要在spec_helper中使用以下代码。要使用它,您可以添加一个false作为#make的第一个参数。
module Machinist
module ActiveRecordExtensions
module ClassMethods
def make_with_skip_validation(*args, &block)
validate = !(!args.pop if ( (args.first == true) || (args.first == false) ))
begin
make_without_skip_validation(*args, &block)
rescue ActiveRecord::RecordInvalid => invalid
if validate
raise invalid
else
invalid.record.save(false)
end
end
end
alias_method_chain :make, :skip_validation
end
end
end