Обход проверки с машинистом - PullRequest
1 голос
/ 02 июня 2009

Я пишу свои спецификации для моей модели Thing, у которой есть поле даты, которое должно быть после даты создания, поэтому я использую плагин validate_timeliness , подобный этому

validate_date :date, :after Time.now

Я хочу добавить некоторые вещи с предшествующей датой, но проверка не пройдена. Я хочу обойти проверку при создании некоторых вещей с помощью фабрики machinist .

Любая подсказка?

Ответы [ 4 ]

1 голос
/ 02 июня 2009

Разве ваша проверка не должна гарантировать, что дата находится после атрибута create_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)

Есть ли причина, по которой вы хотите это сделать? Что вы пытаетесь проверить ??

0 голосов
/ 20 апреля 2010

Вы можете поймать исключение, выданное проверкой. Если вам требуется следующий код в вашем 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
0 голосов
/ 02 июня 2009

Хм, нет прямого способа сделать с самим Машинистом. Но вы можете попытаться обмануть его ... в spec / spec_helper переопределите модель Thing до загрузки чертежей машиниста.

class Thing

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

end
0 голосов
/ 02 июня 2009

Если вы вызовете your_obj.save с логическим параметром = true, например: some_obj.save!(true), тогда все проверки будут пропущены. Вероятно, это недокументированная функция ActiveRecord, которая широко используется в моей компании:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...