绕过机械师的验证

时间:2009-06-01 20:59:54

标签: ruby-on-rails ruby rspec

我在我的模型Thing上编写我的规范,它的日期字段应该在创建日期之后,因此我使用 validate_timeliness 插件

validate_date :date, :after Time.now

我希望能够添加一些具有前期日期的东西但验证失败。我想在使用 machinist 工厂创建一些东西时绕过验证。

有任何线索吗?

4 个答案:

答案 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)

嗯,对于机械师本身没有直接的方法。但你可以尝试欺骗它......在spec / spec_helper中,在加载机械师蓝图之前重新定义Thing模型。

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