2010-03-18 3 views
4

Ok validation dire que j'ai le modèle suivant:rails + rspec: rester au sec lors du test

class Country < ActiveRecord::Base 
    validates_presence_of :name 
    validates_presence_of :code 
end 

Je fais les tests unitaires rspec pour ces validations. Ils ressemblent à ceci:

it "should be invalid without a name" do 
    country = Country.new(@valid_attributes.except(:name)) 
    country.should_not be_valid 
    country.errors.on(:name).should == "can't be blank" 
    country.name = @valid_attributes[:name] 
    country.should be_valid 
    end 

    it "should be invalid without a code" do 
    country = Country.new(@valid_attributes.except(:code)) 
    country.should_not be_valid 
    country.errors.on(:code).should == "can't be blank" 
    country.code = @valid_attributes[:code] 
    country.should be_valid 
    end 

Cela ne semble pas très DRY. Y a-t-il une gemme ou un plugin qui automatise ce genre de choses? Je voudrais obtenir quelque chose le long de ces lignes:

it "should be invalid without a name" do 
    test_presence_validation :name 
    end 

    it "should be invalid without a code" do 
    test_presence_validation :code 
    end 

Répondre

9

Il sont remarquables pour que: http://github.com/carlosbrando/remarkable

Une fois que vous pouvez faire

it { should validate_presence_of :name } 
+0

C'est exactement ce que je cherchais. Je vous remercie! – kikito

+3

Et si j'ai une méthode de validation personnalisée? par exemple. classe Utilisateur valider: check_my_stuff fin – stream7

5

Si vous utilisez factory_girl, vous pouvez faire:

it "should be invalid without a name" do 
    FactoryGirl.build(:country, name: nil).should_not be_valid 
    end 

Une suggestion ... n'utilisez pas le mot-clé "should" sur toutes les spécifications. A la place, écrivez: "est invalide sans nom"

+2

+1 pour la recommandation "devrait". Depuis que j'ai écrit ceci, j'ai migré vers des spécifications "sans-dessous". – kikito

+0

Pourquoi enlever le devrait? – Noz

+0

@Cyle car les descriptions doivent être écrites au présent. –

Questions connexes