2012-03-07 15 views
5

मान लीजिए कि मेरे पास कई OrderProcessor एस हैं, उनमें से प्रत्येक एक आदेश को थोड़ा अलग तरीके से संभालता है।
निर्णय के बारे में जो OrderProcessor उपयोग करने के लिए Order ऑब्जेक्ट के गुणों के अनुसार किया जाता है, और, इसलिए जैसे एक कारखाने विधि द्वारा किया जाता है:यूनिट परीक्षण फ़ैक्टरी विधि

public IOrderProcessor CreateOrderProcessor(IOrdersRepository repository, Order order, DiscountPercentages discountPercentages) 
{ 
    if (order.Amount > 5 && order.Unit.Price < 8) 
    { 
     return new DiscountOrderProcessor(repository, order, discountPercentages.FullDiscountPercentage); 
    } 

    if (order.Amount < 5) 
    { 
     // Offer a more modest discount 
     return new DiscountOrderProcessor(repository, order, discountPercentages.ModestDiscountPercentage); 
    } 

    return new OutrageousPriceOrderProcessor(repository, order); 
} 

अब, मेरी समस्या यह है कि मुझे लगता है कि सत्यापित करना चाहते है लौटा OrderProcessor सही पैरामीटर प्राप्त किया है (उदाहरण के लिए - सही छूट प्रतिशत)।
हालांकि, वे गुण OrderProcessor इकाइयों पर सार्वजनिक नहीं हैं।

आप इस परिदृश्य को संभालने का सुझाव कैसे देंगे?

एकमात्र समाधान मैं के साथ OrderProcessor सार्वजनिक की छूट प्रतिशत संपत्ति कर रही है आने के लिए सक्षम था, लेकिन यह एक overkill करने के लिए की तरह सिर्फ इकाई परीक्षण के लिए है कि लगता है ...

उत्तर

3

इसके आस-पास एक तरीका उन क्षेत्रों को बदलना है जिन्हें आप निजी के बजाय आंतरिक में परीक्षण करना चाहते हैं और फिर परियोजना के आंतरिक परीक्षण परियोजना को दृश्यमान सेट करें। आप इस यहाँ पढ़ सकते हैं: http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

आप अपने AssemblyInfo.cs फ़ाइल में कुछ इस तरह करना होगा:

[assembly:InternalsVisibleTo("Orders.Tests")] 

आप तर्क दे सकता है, लेकिन है कि आपके इकाई परीक्षण जरूरी आप के निजी क्षेत्रों के बारे में परवाह नहीं करना चाहिए कक्षा। हो सकता है कि फैक्ट्री विधि में मानों को पार करना बेहतर हो और अपेक्षित परिणाम के लिए इकाई परीक्षण लिखें, जब कुछ विधि (मानते हैं कि गणना() या कुछ समान) इंटरफ़ेस पर कॉल किया जाता है।

या एक अन्य दृष्टिकोण ठोस प्रकारों (डिस्काउंट ऑर्डर प्रोसेसर इत्यादि) का परीक्षण करने के लिए होगा और सार्वजनिक तरीकों/गुणों से उनके वापसी मूल्यों की पुष्टि करेगा। फिर फैक्ट्री विधि के लिए यूनिट परीक्षण लिखें कि यह सही प्रकार के इंटरफ़ेस कार्यान्वयन को सही तरीके से देता है।

ये दृष्टिकोण हैं जो मैं आमतौर पर समान कोड लिखते समय लेता हूं, हालांकि इस तरह की समस्या से निपटने के कई अलग-अलग तरीके हैं। मैं यह निर्धारित करने की सिफारिश करता हूं कि आपको इकाई परीक्षणों में सबसे अधिक मूल्य कहाँ मिलेगा और इसके अनुसार लिखें।

1

हैं छूट प्रतिशत सार्वजनिक नहीं है, तो यह IOrderProcessor अनुबंध का हिस्सा नहीं है और इसलिए सत्यापित करने की आवश्यकता नहीं है। डिस्काउंटऑर्डर प्रोसेसर के लिए केवल यूनिट परीक्षणों का एक सेट है ताकि यह सत्यापित किया जा सके कि यह कन्स्ट्रक्टर के माध्यम से पारित छूट प्रतिशत के आधार पर आपकी छूट का उचित रूप से कंप्यूटिंग कर रहा है।

+1

हालांकि यह अच्छा और अच्छा है, यह जानना उचित लगता है कि सही छूट प्रतिशत का उपयोग किया जा रहा है, अन्यथा कोई भी शीर्ष पथ दोनों को 'छूट प्रतिशत। पूर्ण DiscountPercentage' वापस करने के लिए कोड बदल सकता है और कोई भी नहीं जानता, और अचानक लोगों को मामूली एक –

+0

ठीक से पूर्ण छूट मिलना शुरू हो जाएगा, ठीक है, वर्चुअल विधि में डिस्काउंटऑर्डर प्रोसेसर का निर्माण करें और सुनिश्चित करें कि इसे आपके फैक्ट्री तर्क के आधार पर उपयुक्त पैरामीटर के साथ बुलाया गया है। – PatrickSteele

+0

मुझे पैट्रिक से सहमत होना होगा। ऐसा लगता है कि आप इकाई परीक्षण से एकीकरण परीक्षण में बाहर निकल रहे हैं (जो भी महत्वपूर्ण है)। यूनिट परीक्षण एक तार्किक इकाई के लिए है और प्रत्येक ऑर्डर प्रोसेसर के पास अपने स्वयं के यूनिट परीक्षण होना चाहिए। –

0

आपके पास कुछ विकल्प हैं जो मैं इसे देखता हूं। आप डिस्काउंट ऑर्डर प्रोसेसर की विशेषज्ञता बना सकते हैं:

public class FullDiscountOrderProcessor : DiscountOrderProcessor 
{ 
    public FullDiscountOrderProcessor(IOrdersRepository repository, Order order):base(repository,order,discountPercentages.FullDiscountPercentage) 
    {} 
} 

public class ModestDiscountOrderProcessor : DiscountOrderProcessor 
{ 
    public ModestDiscountOrderProcessor (IOrdersRepository repository, Order order):base(repository,order,discountPercentages.ModestDiscountPercentage) 
    {} 
} 

और सही प्रकार के लिए जांचें।

आप डिस्काउंट ऑर्डर प्रोसेसर बनाने के लिए कारखाने में जा सकते हैं जो केवल राशि लेता है, तो आप जांच सकते हैं कि इसे सही पैरा के साथ बुलाया गया था।

आप डिस्काउंट ऑर्डर प्रोसेसर बनाने के लिए वर्चुअल विधि प्रदान कर सकते हैं और जांच सकते हैं कि सही पैरा के साथ कहा जाता है।

मुझे व्यक्तिगत रूप से पहला विकल्प पसंद है, लेकिन इन सभी दृष्टिकोणों को एक ही समस्या से पीड़ित है, अंत में आप वास्तविक मूल्य की जांच नहीं कर सकते हैं और इसलिए कोई आपकी छूट राशि बदल सकता है और आपको पता नहीं चलेगा। यहां तक ​​कि पहला दृष्टिकोण जो आप समाप्त करेंगे, यह जांचने में सक्षम नहीं है कि FullDiscountOrderProcessor पर लागू मूल्य क्या था। - ताकि आप उन्हें पूछताछ कर सकते हैं

आप गुण सार्वजनिक (InternalsVisibleTo का उपयोग कर या आंतरिक) कर सकता है:

आप वास्तविक मान जो आप के साथ छोड़ देता है की जाँच करने के किसी न किसी प्रकार की आवश्यकता है।

आप लौटे ऑब्जेक्ट को ले सकते हैं और जांच सकते हैं कि यह उस वस्तु को सही ढंग से लागू करता है जिसे आप पास करते हैं।

व्यक्तिगत रूप से मैं गुणों को आंतरिक बनाने के लिए जाता हूं, लेकिन यह इस बात पर निर्भर करता है कि ऑब्जेक्ट्स कैसे बातचीत करते हैं और डिस्काउंट ऑर्डर प्रोसेसर में नकली ऑब्जेक्ट पास करते हैं और यह सत्यापित करते हैं कि यह सही तरीके से कार्य किया गया है, तो यह एक आसान हो सकता है बेहतर समाधान

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