1

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

validate_date :date, :after Time.now

我希望能够添加一些日期较早的东西,但验证失败。我想在使用机械师工厂创建一些东西时绕过验证。

有什么线索吗?

4

4 回答 4

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)

你有这样做的理由吗?你想测试什么??

于 2009-06-02T06:01:46.507 回答
0

如果您使用布尔参数 =true 调用 your_obj.save ,例如:some_obj.save!(true),则将跳过所有验证。这可能是我公司广泛使用的未记录的 ActiveRecord 功能 :)

于 2009-06-01T23:03:30.570 回答
0

嗯,没有直接的方法来处理机械师本身。但是您可以尝试欺骗它……在 spec/spec_helper 中,在加载 Machinist 蓝图之前重新定义 Thing 模型。

class Thing

def before_validation
  self.date = 1.hour.from_now
end

end
于 2009-06-02T05:01:05.343 回答
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
于 2010-04-20T18:29:35.867 回答