2009-06-01 5 views
1

Je vous écris mes specs sur mon modèle chose qui a un champ de date qui devrait être après la date de création, donc j'utilise le validate_timeliness plug-in comme çavalidation Contourner avec machiniste

validate_date :date, :after Time.now 

Je veux être capable d'ajouter des choses avec une date antérieure mais la validation échoue. Je veux contourner la validation lors de la création de certaines choses avec l'usine machiniste.

Une idée?

Répondre

1

Votre validation ne doit-elle pas garantir que la date est postérieure à l'attribut created_at? Plutôt que Time.now ???

Vous ne devriez pas essayer d'utiliser des données invalides dans vos tests, ce que vous devriez probablement faire à la place est fudge créé à l'heure.

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

La seule raison pour essayer de mettre un temps dans le passé dans votre spec devrait sûrement pour vérifier que la validation fonctionne bien ..

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

Y at-il une raison pour laquelle vous voulez fais ça? Qu'est-ce que vous essayez de tester ??

+0

Je voulais simuler une donnée qui a été ajoutée il y a un jour. Hier cela pourrait être ajouté, aujourd'hui non. J'ai trouvé une astuce pour faire cela en réglant le Time.now à hier. Je vais essayer d'utiliser le plugin time_travel, mais c'est logique. Je vais également tester avec created_at plutôt que Time.now – toofancy

0

Si vous appelez votre_obj.save avec un paramètre booléen = true comme ceci: some_obj.save!(true), toutes les validations seront ignorées. C'est probablement la fonction ActiveRecord non documentée qui est largement utilisée dans mon entreprise :)

0

Hmm, il n'y a pas de moyen direct avec Machinist lui-même. Mais vous pouvez essayer de le tromper ... dans spec/spec_helper, redéfinir le modèle Thing avant que les blueprints machinistes soient chargés.

class Thing 

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

end 
0

Vous pouvez intercepter l'exception générée par la validation. Si vous avez besoin du code suivant dans votre spéc_helper après avoir demandé un machiniste. Pour l'utiliser, vous pouvez ajouter un faux comme premier argument à #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 
Questions connexes