2012-10-27 13 views
5

Die vom Learn Rails by example book kommt:Testing ungültige E-Mails mit Rspec

describe "when email format is invalid" do 
    it "should be invalid" do 
     addresses = %w[[email protected],com user_at_foo.org [email protected] 
        [email protected]_baz.com [email protected]+baz.com] 
     addresses.each do |invalid_address| 
     @user.email = invalid_address 
     @user.should_not be_valid 
     end  
    end 

Ich bin ein Anfänger in Rspec. Früher gab es wie folgt ein Code:

describe "when email is not present" do 
    before { @user.email = " " } 
    it { should_not be_valid } 
    end 

Also ich frage mich, warum der Autor nicht den obigen Code wie folgt geschrieben hat:

describe "when email format is invalid" do 
    before do 
     addresses = %w[[email protected],com user_at_foo.org [email protected] 
        [email protected]_baz.com [email protected]+baz.com] 
     @user.email = invalid_address 
     addresses.each do |invalid_address| 
     @user.email = invalid_address 
     end 
    end 

    it { should_not be_valid }   
end 

OK, vielleicht ist dieser Code falsch. Aber im Grunde frage ich, warum der Autor nicht before vor it verwendet oder die address Variable vor it setzen? (Wie er im vorigen Beispiel tat)

EDIT:

Er tut auch etwas ähnliches in einem weiteren Beispiel:

describe "when email address is already taken" do 
    before do 
     user_with_same_email = @user.dup 
     user_with_same_email.email = @user.email.upcase 
     user_with_same_email.save 
    end 

    it { should_not be_valid } 
    end 

Antwort

7

Die Antwort liegt in dem, was der before Block tatsächlich tun. In diesen Tests wird es vollständig ausgeführt, bevor die it ausgeführt wird.

der erste Codeblock So wird ausgeführt (und kann geschrieben werden) als:

@user.email = '[email protected],com' 
@user.should_not be_valid 
@user.email = 'user_at_foo.org' 
@user.should_not be_valid 
@user.email = '[email protected]' 
@user.should_not be_valid 
@user.email = '[email protected]_baz.com' 
@user.should_not be_valid 
@user.email = '[email protected]+baz.com' 
@user.should_not be_valid 

Und der zweite Block von Code ausgeführt (und geschrieben werden kann) als:

@user.email = ' ' 
@user.should_not be_valid 

Aber der dritte Block würde Schleife durch das gesamte Array vor zum it immer nur in resultierenden:

@user.email = '[email protected]+baz.com' 
@user.should_not be_valid 

Im letzten Beispiel führt er eine Reihe von Operationen gegen das gleiche Objekt durch, die vor der it ausgewertet werden, die nur einmal ausgeführt werden muss, um einen Sinn zu ergeben.

Hoffe, das hilft, viel Glück!

+0

Vielen Dank! Es ist jetzt alles klar. – alexchenco

+0

Gut, herzlich willkommen! –