2010-06-15 12 views

Répondre

2
should allow_value(" ").for(:email) 
should allow_value(nil).for(:email) 
+0

je suis encore « erreurs devraient inclure "a déjà été prise" lorsque e-mail est défini sur zéro, n'a pas d'erreur "lors de l'exécution doit valider_unicité (de: email). – Pablo

-3

peut-être

should validate_uniqueness_of(:email, :allow_blank => true) 
+0

Non, ça ne marche pas. – Pablo

2

Je l'ai tout compris !! Le paramètre validate_uniqueness_of se base sur la valeur de l'attribut que vous testez actuellement sur le premier enregistrement de la base de données. Donc, si le premier enregistrement dans la base de données est vide ou nul pour cet attribut, votre test donnera toujours une erreur comme ceci: "Failure/Error: it {should validate_uniqueness_of (: customer_number) .case_insensitive.scoped_to (: user_id)} Les erreurs attendues à inclure "a déjà été prise" lorsque customer_number est défini sur "zéro", ne comportent aucune erreur ".

Alors, comment pouvons-nous résoudre ce problème? Assurez-vous de supprimer tous les enregistrements existants et que le premier enregistrement contient une valeur renseignée pour l'attribut.

modèle:

validates_uniqueness_of :customer_number, :scope => :user_id, :case_sensitive => false, :allow_blank => true, :allow_nil => true 
spec modèle

:

describe 'Validation' do 

    it { should allow_value('').for(:customer_number) } 

    describe 'When a user exists with the same customer_number and user' do 
    before(:each) do 
     Customer.destroy_all 
     # Saving a single customer to validate uniqueness. 
     @existing = Factory(:customer, :customer_number => 'test') # If you leave customer_number blank here the matcher will check if it can save a new record with a blank customer_number which is possible since we allow blanks. So make sure your first record has a filled in value!! 
    end 

    subject do 
     Factory.build(:customer) 
    end 

    it { should validate_uniqueness_of(:customer_number).case_insensitive.scoped_to(:user_id) } 
    end 
end 

Hope this éclairci certains problèmes des gens :)

+0

C'est la meilleure explication pour cette erreur de test (ce qui semble un problème assez commun!). Merci. –