2013-08-20 70 views
22

我有一類,那就是一些其他類的基礎,專業的行爲:測試簡單STI與FactoryGirl

class Task < ActiveRecord::Base 
    attr_accessible :type, :name, :command 
    validates_presence_of :type, :name, :command 

    # some methods I would like to test 

end 

類CounterTask從任務

繼承
class CounterTask < Task 
end 

這一切工作很好,直到我試圖測試基類,因爲它必須有一個類型。

FactoryGirl.define do 
    factory :task do 
    sequence(:name) { |n| "name_#{n}" } 
    sequence(:command) { |n| "command_#{n}" } 
    end 
end 

您將如何測試超類的基本功能?

+3

不應該寫你的測試,以便它測試的功能,而不是實施?在這種情況下,這意味着你會測試'CounterTask'是否具有從'Task'獲得的屬性和其他東西。如果你改變你的實現,例如不再使用STI。如果您的CounterTask保持相同的行爲,您的測試仍然可以成功。 – Arjan

+0

這是一個很好的觀點。我只是認爲如果我首先測試基本功能,然後測試子類,我會在測試中保存一些重複內容......也許這可能是我的問題的解決方案。 – Mark

回答

48

可以聲明工廠的定義如下:

FactoryGirl.define do 
    factory :task, class: 'Task' do 
    shop 
    currency 
    value 10 
    end 

    factory :counter_task, parent: :task, class: 'CounterTask' do 
    end 
end 

現在你可以測試基類,自己的工廠孤立,同爲每個繼承類。

+2

我只需要將'class'選項傳遞給子工廠就可以完成這個工作:'factory:counter_task,class:'CounterTask'do'(父類工廠不需要'class'選項)。 – gabe

+0

@gabe省略'class:'Task''也適用於我,但是,如果您希望在使用counter_task時定義在任務塊中定義的屬性,則「parent::task」似乎意義重大。因此,使用'parent::task','build(:counter_task).value == 10'。如果你不設置父項,'build(:counter_task).value == nil'。 – LiamD