2012-04-12 17 views
24

मैं जितना संभव हो सके टेस्ट ड्राइव विकास का उपयोग करना चाहता हूं - यह काम करने का एक शानदार तरीका है।मैं एक सिम्फनी 2 नियंत्रक का परीक्षण कैसे कर सकता हूं?

मैं इस तथ्य से परेशान हूं कि Symfony2 नियंत्रक एक नया Response ऑब्जेक्ट बनाते हैं और वापस करते हैं।

मैं इकाई अलगाव में नियंत्रक का परीक्षण करने में सक्षम होना चाहता हूं।

आप यह कैसे करते हैं?

क्या एक सादा ओल्ड PHP ऑब्जेक्ट के रूप में नियंत्रक बनाने का उत्तर है, इसे एक सेवा के रूप में पंजीकृत करें और इसमें Response ऑब्जेक्ट (या Response फैक्ट्री) पास करने के लिए निर्भरता इंजेक्शन का उपयोग करें?

+2

क्या वास्तव में एक 'Response' वस्तु लौटने इसके साथ मुसीबत है? –

+0

कुछ भी नहीं। मुझे बस इस तथ्य को पसंद नहीं है कि एक प्रतिक्रिया वस्तु नियंत्रक में बनाई गई है। मैं निर्भरता इंजेक्शन का दृढ़ आस्तिक हूं, और मुझे डीआई कंटेनर के अलावा किसी अन्य चीज़ में "नया" कीवर्ड देखने से नफरत है। शायद यह विश्वास गलत है। –

उत्तर

51

आम तौर पर साथ छोड़ दिया जाता है लगता है, अपने नियंत्रक एक साथ विभिन्न वस्तुओं प्लग और उन्हें सही क्रम में जोड़ता है। हो सकता है कि वह एक भंडार कहता है, कुछ वस्तुओं को पढ़ता है और उन्हें रेंडर विधि के माध्यम से लौटाता है। शायद वह कुछ अन्य हैंडलर/प्रबंधक जो सामान करते हैं उन्हें बुलाता है।

इसका मतलब है कि नियंत्रक एक उच्च स्तरीय घटक है। इससे अधिक बार यह इंगित करता है कि यूनिट परीक्षणों के बजाय कार्यात्मक परीक्षण क्रम में हैं। आपको अपने यूनिट परीक्षणों के साथ 100% कोड कवरेज प्राप्त करने का लक्ष्य नहीं रखना चाहिए। हो सकता है कि आप इस तरह से सोच सकें: यदि आप नियंत्रक कॉल (मॉडल, सत्यापन, फॉर्म, रिपोजिटरी) की सभी चीजों का परीक्षण करते हैं, तो क्या गलत हो सकता है? अधिकांश समय यह ऐसा होता है जब आप उत्पादन में शामिल सभी वास्तविक वर्गों का उपयोग करते समय केवल तभी देखते हैं।

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

यदि आपका नियंत्रक सिस्टम के हिस्सों को प्लग करने से अधिक करता है तो आपको सामान को कम-स्तरीय कक्षाओं में पुन: सक्रिय करने के बारे में सोचना चाहिए, जिसे आप यूनिट-टेस्ट के साथ परीक्षण कर सकते हैं।

तो मेरा सुझाव आपके नियंत्रकों का परीक्षण करने के लिए कार्यात्मक परीक्षणों का उपयोग करना होगा और आपके मॉडल और आपके व्यापार तर्क सामग्री का परीक्षण करने के लिए यूनिट-टेस्ट का उपयोग करना होगा।

आप कार्यात्मक परीक्षण के साथ संघर्ष, तो आपको निम्न पढ़ सकते हैं:

+0

ठीक है। मैंने सोचा कि चूंकि नियंत्रक एक वर्ग था, इसलिए इसे इकाई परीक्षण भी करने की आवश्यकता थी। मुझे परीक्षण लिखने से पहले कोड लिखने का विचार पसंद नहीं है, इसलिए मैं सोच रहा था कि यूनिट परीक्षण करने में सक्षम होने के लिए नियंत्रकों का उपयोग करने के तरीके का पुन: उपयोग करने का कोई तरीका था या नहीं। मुझे लगता है कि मैं नियंत्रक लिखने से पहले मैं अभी भी कार्यात्मक परीक्षण लिखकर टीडीडी के साथ काम कर सकता हूं। –

2

उपयोग मॉडल और मुख्य नियंत्रक विधि के तर्क से अन्य वस्तुओं को अलग करने के लिए, देखें http://www.phpunit.de/manual/3.7/en/test-doubles.html#test-doubles.mock-objects

मुझे लगता है कि पुराने संस्करणों में आप पूरी क्लास नकली सकता का मजाक उड़ाता है, लेकिन नवीनतम PHPUnit 3.6.10 है कि मैं के साथ ऐसा नहीं होता काम करने लगते हैं। तो मैं तुम्हें depency इंजेक्शन पैटर्न

class objss{ 
    function ss(){ 
     $x = new zz(); 
     var_dump($x->z()); 
    } 
} 



class MoTest extends PHPUnit_Framework_TestCase{ 
    public function setUp(){ 

    } 

    public function testA(){ 
     $class = $this->getMock('zzMock', array('z'), array(), 'zz'); 
     $class->expects($this->any())->method('z')->will($this->returnValue('2')); 

     $obj = new objss(); 
     $this->assertEquals('2', $obj->ss()); 
    } 
} 
+0

टोतिली - लेकिन इन ऑब्जेक्ट्स (प्रतिक्रिया वस्तु सहित) को नियंत्रक में तत्काल किया जाएगा। जब तक मैं नियंत्रक के लिए मॉडल और अन्य चीजें प्रदान करने के लिए डी कंटेनर का उपयोग नहीं करता। शायद मैं एक प्रतिक्रिया कारखाना सेवा बना सकता हूं, और इसे डी कंटेनर से प्राप्त कर सकता हूं - इस तरह यह (डी कंटेनर और फैक्ट्री) को अलगाव में नियंत्रक वर्ग का परीक्षण करने के लिए मजाक किया जा सकता है। –

0

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

मेरे दिमाग में एक परीक्षण का बिंदु एक सैंडबॉक्स वाला वातावरण बनाना, परीक्षण चलाने और साइड इफेक्ट्स और प्रत्यक्ष परिणाम की जांच करना है। यदि आप उस बिंदु पर पहुंच जाते हैं जहां आपका अधिकांश परीक्षण विधि को अलग कर रहा है, तो संभवतः यह एक अलग परीक्षण दृष्टिकोण या आपकी कक्षा लिखने के लिए एक अलग दृष्टिकोण के लिए समय है। यह देखते हुए कि यह एक नियंत्रक है, और प्रकृति से वे ढेर के विभिन्न टुकड़ों को एक साथ चिपकते हैं, मैं आपके सैंडबॉक्स को ढेर से आगे बढ़ाऊंगा।

https://github.com/PolishSymfonyCommunity/SymfonyMockerContainer

मुझे :)

1

यूनिट टेस्टिंग

के लिए महान काम किया Refactor अपने नियंत्रकों सेवाओं होने के लिए:: फिर http://symfony.com/doc/current/cookbook/controller/service.html

आप विशेष रूप से, मैं इस तरह एक दृष्टिकोण का प्रयोग करेंगे आसानी से इकाई परीक्षण कर सकते हैं।

कार्यात्मक परीक्षण

बेशक

(पहले से ही दूसरों के द्वारा उल्लेख किया) आप WebTestCase को यहां बताए गए उपयोग कर सकते हैं: http://symfony.com/doc/current/book/testing.html#functional-tests

+0

सेवाओं के रूप में परिभाषित नियंत्रकों को आधिकारिक तौर पर सिम्फनी द्वारा अनुशंसित नहीं किया जाता है। इन्हें कुछ डेवलपर्स द्वारा बहुत विशिष्ट उपयोग मामलों, जैसे कि डीडीडी (डोमेन-संचालित डिज़ाइन) और हेक्सागोनल आर्किटेक्चर अनुप्रयोगों के लिए उपयोग किया जाता है। –

+0

कौन कहता है? https://symfony.com/doc/current/controller/service.html समर्थक अपने स्वयं के दस्तावेज़ में कॉन का आउटपुट करता है। मुझे यकीन है कि नियंत्रक निश्चित रूप से सिम्फनी के भविष्य के संस्करणों में समर्थित होंगे, इसलिए मैं "आधिकारिक रूप से अनुशंसित नहीं होने" के बारे में बहुत ज्यादा चिंता नहीं करता। –

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