2012-10-27 26 views
5

這個來自Learn Rails by example book測試無效的電子郵件使用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 

我在Rspec的初學者。此前,曾有這樣的代碼:

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

所以我想知道作者爲什麼沒有寫上面這樣的代碼:

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 

好吧,也許這個代碼是錯誤的。但基本上,我在問爲什麼作者在it之前沒有使用before或者在it之前使用address變量?

EDIT(因爲他在前面的例子一樣):

他也確實在進一步的例子類似的東西:

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 

回答

7

答案是什麼before塊實際上做。在這些測試中,在運行it之前它正在全面運行。

所以,代碼的第一個塊上運行(和可以寫)爲:

@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 

而且代碼的第二塊被運行(和可以寫)爲:

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

但是,第三個塊將通過整個陣列循環前進入it,導致只有:

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

在最後一個例子中,他正在針對同一個對象執行一系列操作,這些操作在it之前進行評估,只需要運行一次就可以了。

希望這會有所幫助,祝你好運!

+0

非常感謝!現在很清楚。 – alexchenco

+0

對不起,不客氣! –

相關問題