2010-06-28 16 views
9

J'utilise quelques-uns des Shoulda rspec matchers à l'épreuve mon modèle, l'un d'entre eux étant:Shoulda rspec Matchers: sur =>: créer

describe Issue do 
    it { should_not allow_value("test").for(:priority) } 
end 

Mon problème est que ma validation dans mon modèle ressemble à ceci:

validates_format_of :priority, :with => /^(Low|Normal|High|Urgent)$/, :on => :update 

donc lors de l'exécution de ce test je reçois:

1) 'Issue should not allow priority to be set to "test"' FAILED 
    Expected errors when priority is set to "test", got errors: category is invalid (nil)title can't be blank (nil)profile_id can't be blank (nil) 

La validation n'est pas déclenché Beca l'utiliser ne fonctionne que sur une mise à jour, comment puis-je utiliser ces appariements shoulda sur une mise à jour vs une création?

Répondre

12

Je pense que shoulda devrait mieux gérer cela. Je suis tombé sur ceci parce que je veux seulement exécuter mon contrôle de validation d'unicité pour mon modèle d'utilisateur lors de la création de nouveaux utilisateurs. Il est une perte d'une requête de base de données de le faire sur la mise à jour, puisque je ne permets pas les noms d'utilisateur à modifier:

validates :username, :uniqueness => { :case_sensitive => false, :on => :create }, 

Heureusement, vous pouvez contourner ce problème en définissant explicitement le « sujet »:

describe "validation of username" do 
     subject { User.new } 
     it { should validate_uniqueness_of(:username) } 
    end 

De cette façon, il ne fait que tester sur une nouvelle instance. Dans votre cas, vous pouvez probablement changer le sujet pour qu'il soit déjà enregistré dans la base de données, avec tous les champs nécessaires.

+0

Merci @endium. De même, 'subject {FactoryGirl.create (: user)}' peut être utilisé pour tester les validations 'on:: update'-only. – scarver2