我正在我的模型事物上编写规范,该模型事物的日期字段应该在创建日期之后,因此我使用validate_timeliness插件
validate_date :date, :after Time.now
我希望能够添加一些日期较早的东西,但验证失败。我想在使用机械师工厂创建一些东西时绕过验证。
有什么线索吗?
我正在我的模型事物上编写规范,该模型事物的日期字段应该在创建日期之后,因此我使用validate_timeliness插件
validate_date :date, :after Time.now
我希望能够添加一些日期较早的东西,但验证失败。我想在使用机械师工厂创建一些东西时绕过验证。
有什么线索吗?
您的验证不应该确保日期在 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)
你有这样做的理由吗?你想测试什么??
如果您使用布尔参数 =true 调用 your_obj.save ,例如:some_obj.save!(true)
,则将跳过所有验证。这可能是我公司广泛使用的未记录的 ActiveRecord 功能 :)
嗯,没有直接的方法来处理机械师本身。但是您可以尝试欺骗它……在 spec/spec_helper 中,在加载 Machinist 蓝图之前重新定义 Thing 模型。
class Thing
def before_validation
self.date = 1.hour.from_now
end
end
您可以捕获验证引发的异常。如果您在需要机械师之后在您的 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