2013-11-28 75 views
2

我正在嘗試編寫一個單元測試來檢查我定義的Ruby模型是否有屬性name。使用rspec,我有:如何避免編寫一個重複測試

class MusicianTest < ActiveSupport::TestCase 

    describe Musician do 
    let(:musician) { Musician.new } 

    describe "attributes" do 
     it "has a name" do 
     musician.name = "Axel" 
     expect(musician.name).to eq("Axel") 
     end 
    end 

    end 
end 

這是重言式嗎?有沒有更好的方法可以使用?

+0

你可以只是'期待(它「有一個名字」)'? –

+0

@AaronBrager這將是很好,但不會工作,因爲它沒有爲該上下文定義。 – ivan

回答

2

有幾種方法可以更好地測試它,我認爲。如果你的模型是一個ActiveRecord,那麼你可以檢查column_names財產

musician.column_names.should include 'name' 

如果它是一個普通的紅寶石對象,然後,如果它響應getter和setter方法

musician.should respond_to(:name) 
musician.should respond_to(:name=) 

一般來說,你可以檢查,規則是你的測試應該說明你正在測試的內容。例如,你的測試看起來像你正在測試setter和getters,如果你在setter/getters中做了一些神奇的事情,並且想確保事情能夠正常工作,那麼這是非常好的和合法的。

因此,在你的情況下,如果你想驗證一個屬性是否存在,你應該只說attributes.include 'name'或類似的東西。

在腳註上。如果你正在做一些vanilla ActiveRecord測試,我個人不會測試屬性的存在,我會定義一個具有應該存在的屬性的工廠,如果由於某種原因他們錯過了測試,每當你產生時都會崩潰FactoryGirl的新對象。

2

這不是重言式。您正在使用setter方法name=分配一個值,並使用getter方法name來讀取它。如果測試成功,這意味着一次往返旅程是冪等的,但這不是重言式。這是有意義的。

至於證明不是重言式,有可能以某種方式定義一對方法name=name,以便測試失敗。