2016-02-08 119 views
0

模型我有一個Profile模型:測試一個Rails belongs_to的使用RSpec

class Profile < ActiveRecord::Base 
    belongs_to :user 

    def fields_needed_for_completion 
    [self.name, self.city] 
    end 

    def completed? 
    !fields_needed_for_completion.any? { |f| f.nil? || f == "" } 
    end 
end 

我試圖確定如何編寫單元測試與belongs_to關聯的模型。特別是我不確定如何正確設置測試數據。

到目前爲止,我已經把以下內容:

describe Profile do 

    subject(:profile) { FactoryGirl.create(:profile) } 

    describe "fields_needed_for_completion" do 
    context "with all fields missing" do 
     it "returns all fields as nil" do 
     expect(profile.fields_needed_for_completion.all? &:blank?).to be true 
     end 
    end 
    end 

    describe "#completed?" do 
    #TO DO 
    end 
end 

兩個問題:

  1. 是不是蠻好用的FactoryGirl創建配置文件對象,而不是直接調用Profile.create?目前在工廠中沒有設置屬性(即,工廠的定義如下:factory :profile do; end

  2. 如您所見,User型號在這些規格中完全沒有使用。像這樣單獨測試一個模型是否合適?即使在實踐中它屬於用戶?或者我應該以某種方式嘲笑用戶?

+2

無關的問題,但爲什麼你在你的Profile模型中重新創建ActiveModel驗證? – sevenseacat

回答

0

我是這樣看的:

  1. 是的,它是好的,其實 - 您正在使用FactoryGirl正是因爲它的目的。通過工廠創建測試對象(與明確調用Model.create相反),可以在多個測試之間重用創建邏輯,並將所有與創建有關的邏輯集中到一個地方。例如,這意味着,如果您要爲模型添加一個新的強制性(有驗證的)列,那麼您必須僅調整該模型的工廠,而不是在整個測試中修復大量的Model.create事件。

  2. 你的第二個問題是方法論,而不是一個技術所以它更加開放,以判釋,但這裏是我的兩分錢: 我覺得很有道理,測試Profile模型無論是在隔離並與User關係。非用戶相關的邏輯可以獨立測試,用戶相關的邏輯可以在這種情況下進行測試。 請注意,FactoryGirl允許您通過在工廠中定義Userassociation工廠,很容易地設置此上下文。