2012-12-02 14 views
1

我正盡我所能將我的頭圍繞Rspec的流程,但最簡單的事情似乎逃脫了我。在Rspec中傳遞科目

我想在兩個不同的模型上重用一些測試屬性格式的有效性。所以,我認爲我會將這些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 
    end 

爲了這樣的事情:

describe "email format checking" do 
    valid_email_check(@user) 
    end 

..和在utilities.rb

def valid_email_check(subject) 
    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| 
     subject.email = invalid_address 
     subject.should_not be_valid 
     end 
    end 
    end 
end 

「subect」 始終是當傳遞給這個函數爲零。任何幫助讚賞。

+0

您確定@user正在測試中被實例化嗎?無論如何,關於共享示例的建議是很好的。 – zetetic

回答

0

看起來像你參考Listing 6.16 in the Rails Tutorial。我通過使用shoulda-matchers gem和公用程序方法在那裏幹了我的電子郵件相關的驗證測試,類似於您的想法。

我不認爲最好(/可能?)把整個describe塊放在一個實用方法中;只是您可能在多種方法中引用的代碼片段,或者像包含電子郵件地址的數組那樣的很長一段代碼。無論如何,供大家參考,這是我結束了:

的Gemfile

# ... 
gem 'shoulda-matchers', '1.4.2' 

規格/型號/ user_spec.rb

describe User do 

    let(:user) { FactoryGirl.create(:user) } 

    subject { user } 

    # ...  

    describe "validations" do 
    # ... 
    context "for email" do 
     it { should validate_presence_of(:email) } 
     it { should_not allow_value(" ").for(:email) } 
     it { should validate_uniqueness_of(:email).case_insensitive } 

     context "when email format is invalid" do 
     invalid_email_addresses.each do |invalid_address| 
      it { should_not allow_value(invalid_address).for(:email) } 
     end 
     end 

     context "when email format is valid" do 
     valid_email_addresses.each do |valid_address| 
      it { should allow_value(valid_address).for(:email) } 
     end 
     end 
    end 
    end 
end 

規格/支持/實用程序。 rb

# ... 
def invalid_email_addresses 
    %w[[email protected],com user_at_foo.org [email protected] 
    [email protected]_baz.com [email protected]+baz.com] 
end 

def valid_email_addresses 
    %w[[email protected] [email protected] [email protected] [email protected]] 
end