2013-08-20 11 views
22

Mam klasy, który jest podstawą niektórych innych klas, które specjalizuje się zachowanie:Testowanie prosty STI z FactoryGirl

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

    # some methods I would like to test 

end 

Klasa CounterTask dziedziczy Zadanie

class CounterTask < Task 
end 

To wszystko działa dobrze dopóki próbuję przetestować klasę podstawową, ponieważ musi ona mieć typ.

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

Jak można sprawdzić podstawową funkcjonalność nadklasy?

+3

Czy test nie powinien zostać napisany tak, aby testował funkcjonalność, a nie implementację? W tym przypadku oznaczałoby to, że testowałbyś, czy 'CounterTask' ma atrybuty i inne rzeczy, które otrzymuje z' Task'. Jeśli zmienisz swoją implementację, na przykład nie używając już STI. Twój test może się powieść, jeśli twoje "CounterTask" zachowuje to samo zachowanie. – Arjan

+0

To jest dobra uwaga. Pomyślałem, że zachowam niektóre duplikaty w teście, jeśli najpierw przetestuję podstawową funkcjonalność, a potem klasy potomne ... Być może to może być rozwiązanie mojego problemu. – Mark

Odpowiedz

48

Można zadeklarować definicje fabryk następująco:

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

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

I teraz można przetestować klasę bazową odizolowany od swojej własnej fabryce i taki sam dla każdego dziedziczonej klasy.

+2

Musiałem tylko przekazać opcję 'class' do fabryki podrzędnej, aby to działało:' factory: counter_task, class: 'CounterTask' do' (żadna opcja 'class' nie była konieczna dla fabryki macierzystej). – gabe

+0

@gabe Pominięcie 'class: 'Task'' również działa na mnie, ale" parent:: task' wydaje się być znaczące, jeśli chcesz zdefiniować właściwości zdefiniowane w bloku zadań, gdy używasz counter_task. Tak więc z 'parent:: task',' build (: counter_task) .value == 10'. Jeśli nie ustawisz rodzica, 'build (: counter_task) .value == zero'. – LiamD

Powiązane problemy