2009-06-01 21 views
1

Ich schreibe meine Angaben auf meinem Modell Ding, das ein Datumsfeld hat, die nach dem Zeitpunkt der Schöpfung sein sollten, so verwende ich die validate_timeliness Plugin wie dieUmgehen Validierung mit Maschinist

validate_date :date, :after Time.now 

ich will in der Lage sein, einige Dinge mit einem früheren Datum hinzuzufügen, aber die Validierung schlägt fehl. Ich möchte die Validierung umgehen, wenn ich einige Dinge mit der Maschinenfabrik Fabrik herstelle.

Irgendwelche Hinweise?

Antwort

1

Sollte Ihre Validierung nicht sicherstellen, dass das Datum nach dem Attribut created_at liegt? Anstatt Time.now ???

Sie sollten nicht versuchen, ungültige Daten in Ihren Tests zu verwenden, was Sie wahrscheinlich stattdessen tun sollten, täuscht das erstellte rechtzeitig.

@thing = Thing.make(:created_at => 1.day.ago) 

Der einzige Grund, in der Spec eine Zeit in der Vergangenheit sicherlich zu testen sein, um zu versuchen, und setzen sollte, dass die Validierung in der Tat funktioniert ..

@thing = Thing.make_unsaved(:date => 1.day.ago) 
@thing.should have(1).error_on(:date) 

Gibt es einen Grund, warum Sie wollen mach das? Was versuchst du zu testen?

+0

Ich wollte eine Daten simulieren, die vor einem Tag hinzugefügt wurde. Gestern konnte dies hinzugefügt werden, heute nicht. Ich habe einen Trick gefunden, um das zu tun, indem ich die Time.now auf gestern setze. Ich werde versuchen, das time_travel-Plugin zu verwenden, aber das macht Sinn. Ich werde auch mit created_at statt Time.now testen – toofancy

0

Wenn Sie your_obj.save mit einem booleschen Parameter = true wie folgt aufrufen: some_obj.save!(true), dann werden alle Validierungen übersprungen. Dies ist wahrscheinlich die undokumentierte ActiveRecord-Funktion, die in meiner Firma weit verbreitet ist :)

0

Hmm, es gibt keinen direkten Weg mit Machinist selbst zu tun. Aber du kannst versuchen, es auszutricksen ... in spec/spec_helper, definiere das Ding-Modell neu, bevor die Machinist-Pläne geladen sind.

class Thing 

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

end 
0

Sie können die durch die Validierung ausgelöste Ausnahme abfangen. Wenn Sie den folgenden Code in Ihrem spec_helper benötigen, nachdem Sie Maschinist angefordert haben. Um es zu verwenden, können Sie ein false als erstes Argument zu #make hinzufügen.

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