2010-12-10 3 views
2

Je suis nouveau dans Ruby et Rspec. J'écris mon premier test RSpec et je pense que mon code n'est pas très bon. Mais je ne sais pas comment je peux l'améliorer.DRY Problème avec Rspec comment puis-je le réparer

Dans ce fichier je vais vérifier ma classe d'adresse. Le first_name et le last_name sont les mêmes mais j'ai deux gros blocs pour cela. Comment puis-je refactoriser mon code? Et quel est un bon moyen de vérifier RegExp.

Merci.

specify { Factory.build(:address).should be_valid } 


    ### first_name ### 

    it "should be invalid without an first_name" do 
    Factory.build(:address, :first_name => nil).should_not be_valid 
    end 


    context "first_name" do 

    it "should be invalid with more than 20 chars" do 
     Factory.build(:address, :first_name => "#{'b'*21}").should_not be_valid 
    end 

    it "should be invalid with less than 3 chars" do 
     Factory.build(:address, :first_name => "ll").should_not be_valid 
    end 

    it "should be valid with an valid first_name" do  
     valid_names.each do |name| 
     Factory.build(:address, :first_name => name).should be_valid 
     end 
    end 

    it "should be invalid with an invalid first_name" do 
     invalid_names.each do |name| 
     Factory.build(:address, :first_name => name).should_not be_valid 
     end 
    end  
    end 


    ### last_name ### 

    it "should be invalid without an last_name" do 
    Factory.build(:address, :last_name => nil).should_not be_valid 
    end 

    context "last_name" do 
    it "should be invalid with more than 20 chars" do 
     Factory.build(:address, :last_name => "#{'b'*21}").should_not be_valid 
    end 

    it "should be invalid with less than 3 chars" do 
     Factory.build(:address, :last_name => "ll").should_not be_valid 
    end 

    it "should be valid with an valid last_name" do  
     valid_names.each do |name| 
     Factory.build(:address, :last_name => name).should be_valid 
     end 
    end 

    it "should be invalid with an invalid last_name" do 
     invalid_names.each do |name| 
     Factory.build(:address, :last_name => name).should_not be_valid 
     end 
    end  
    end 
def valid_names  
    ["Kai","Ülück's","Schmeißtzs","Rald","Dr. Franzen","rolfes","Lars Michael","Öcück","Mark-Anthony"] 
    end 

    def invalid_names  
    ["-#+*32","   ","a& &lkdf","_-_.l##df"," aaadsa","M€lzer"] 
    end 

Répondre

1

Voici donc la façon dont je le fais parfois ce genre de chose:

describe Address do 
    describe "validations" do 
    before do 
     @address = Factory(:address) 
    end 
    describe "#first_name" do 
     #prove that your factory is correct 
     it "should be valid" do 
     @address.should be_valid 
     end 
     it "should be less than 20 chars" do 
     @address.name = "0" * 20 
     @address.should_not be_valid 
     end 
     it "should be more than 3 chars" do 
     @address.name = "000" 
     @address.should_not be_valid 
     end 
    end 
    end 
end 
+1

Je voudrais utiliser la méthode objet pour cela, comme son fait ici: https://github.com/rspec/rspec-expectations/blob/master/features/expectations/attribute_of_subject.feature – iain

+0

Merci de votre pour votre aide – ThreeFingerMark

1

Rappelez-vous que vos tests ne doivent pas nécessairement être bien sec. Ne sacrifiez pas la lisibilité pour cela. Pensez à vos spécifications comme exemples: quels exemples devraient être valides et lesquels ne devraient pas? C'est aussi l'indice pour tester les expressions régulières: fournir des exemples qui réussissent et d'autres qui ne le font pas.

Pour les validations, j'ai fait quelques coupleurs personnalisés, qui peuvent être trouvés here. Exemple:

describe Address do 
    it { should deny(:last_name).to_be(nil, "", "1", "br", "a& &lkdf","_-_.l##df", "lzer") } 
    it { should allow(:last_name).to_be("Kai","Ülück's","Schmeißtzs","Rald","Dr. Franzen","rolfes","Lars Michael","Öcück","Mark-Anthony") } 
end 
+0

Merci de votre aide – ThreeFingerMark

Questions connexes