2011-09-16 84 views
1

他們說完美的測試只包括測試框架和被測試的類;其他一切應該被嘲笑。那麼,關聯呢?如何編寫rails關聯的規範?

我並不是指簡單的has_many,belongs_to關聯,但關聯擴展和範圍。我真的很想寫範圍的規格,但我不知道如何去做。

回答

1

我得到了這個趕上了。在Rspec中,他們擺脫了「單元測試」的想法。在實踐中,Rails中的單元測試意味着,至少對我而言,測試模型上的屬性值。但你是對的,關於協會呢?

在Rspec中,您只需創建一個spec/models目錄並測試您的模型。在模型規範(spec/models/user_spec.rb)的頂部,你有你的單元測試(測試你的屬性),那麼您測試下面的每個協會:

require 'spec_helper' 

describe User do 
    context ":name" do 
    it "should have a first name" 
    it "should have a last name" 
    end 

    # all tests related to the gender attribute 
    context ":gender" do 
    it "should validate gender" 
    end 

    # all tests related to "belongs_to :location" 
    context ":location" do 
    it "should :belong_to a location" 
    it "should validate the location" 
    end 

    # all tests related to "has_many :posts" 
    context ":posts" do 
    it "should be able to create a post" 
    it "should be able to create several posts" 
    it "should be able to list most recent posts" 
    end 
end 

但現在你在你的User測試PostLocation模型測試?是的。但Post模型將會有一些額外的東西超出它與用戶相關的範圍。與Location一樣。所以,你有一個像spec/models/location_spec.rb:那

require 'spec_helper' 

describe Location do 
    context ":city" do 
    it "should have a valid city" 
    end 

    context ":geo" do 
    it "should validate geo coordinates" 
    end 
end 

都不應該在我看來,被嘲笑。在某些時候,您必須實際測試關聯正在保存且可查詢。就在這裏。考慮一下,在模型規範中,您有屬性的「單元測試」和關聯的「集成測試」。

+1

很好的解釋,謝謝對的!我想補充一點,你應該具備以下規則還:測試你​​的模型有關聯的部分(用戶 - >評論==測試,誰創造,獲取,從用戶對象的透視刪除);不要那個'ActiveRecord'起作用,只測試你對'ActiveRecord'的用法。 – mliebelt

+0

我想補充一句,「測試你自己編寫的代碼。」如果你的模型類與關聯做的唯一事情就是定義它,那麼確保關聯被定義就足夠了(比如,通過確保你可以訪問fixture上的has_many數組)。如果方法調用has_many#build,請測試您的方法,而不是has_many的#build功能。不要採取這種做法,「我的模型提供財產的保證'posts'可以做x,y,z,所以我必須測試它可以做x,y,z。這就是瘋狂。選項組合可算作「你的代碼」來測試imo –