2013-08-20 5 views
22

साथ मैं एक वर्ग मिल गया है, कि कुछ अन्य वर्गों का आधार है कि व्यवहार माहिर:परीक्षण सरल एसटीआई 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

क्या आपका परीक्षण लिखा जाना चाहिए ताकि यह कार्यान्वयन की बजाय कार्यक्षमता का परीक्षण करे? इस मामले में इसका मतलब यह होगा कि आप जांच करेंगे कि क्या 'काउंटरटास्क' में गुण और अन्य चीजें हैं जो इसे 'कार्य' से प्राप्त होती हैं। यदि आप अपना कार्यान्वयन बदलते हैं, उदाहरण के लिए अब एसटीआई का उपयोग नहीं कर रहे हैं। यदि आपका 'काउंटरटास्क' वही व्यवहार करता है तो आपका परीक्षण अभी भी सफल हो सकता है। – 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

मुझे इस काम को करने के लिए केवल 'वर्ग' विकल्प को बच्चे कारखाने में पास करने की आवश्यकता है: 'फैक्ट्री: काउंटर_टास्क, क्लास: 'काउंटरटास्क' डू '(माता-पिता फैक्ट्री के लिए कोई' क्लास 'विकल्प आवश्यक नहीं था)। – gabe

+0

@gabe 'वर्ग' को छोड़कर: 'कार्य' मेरे लिए भी काम करता है, लेकिन, 'parent:: task' महत्वपूर्ण लगता है यदि आप counter_task का उपयोग करते समय कार्य ब्लॉक में परिभाषित गुणों को परिभाषित करना चाहते हैं। तो, 'पैरेंट:: टास्क' के साथ, 'बिल्ड (: counter_task) .value == 10'। यदि आप अभिभावक को सेट नहीं करते हैं, तो 'build (: counter_task) .value == nil'। – LiamD

संबंधित मुद्दे