2012-10-23 16 views
7

में Symfony2 हो रही config पैरामीटर मैं एक Symfony2 सेवा की जाती है कि config.yml से एक पैरामीटर का उपयोग कर साथ बनाया निर्भरता इंजेक्शन का उपयोग कर सकते है। अब मैं इकाई का परीक्षण करने की कोशिश कर रहा हूं और पाया कि इकाई परीक्षण में कंटेनर तक पहुंच नहीं है और इसलिए सेवा। तो मुझे नकली डेटा का उपयोग करके खुद को बनाया जाना चाहिए। यह मुझे समझ में आता है अगर मैं अब कॉन्फ़िगरेशन पैरामीटर पढ़ सकता हूं (config_test.yml को पहले config.yml आदि आदि पर जा रहा है) लेकिन ऐसा प्रतीत होता है कि यह संभव नहीं है। ऐसा लगता है कि इकाई एक सेवा को बोझिल बनाने के लिए प्रतीत होता है क्योंकि मुझे कॉन्फ़िगरेशन फ़ाइलों के बजाय परीक्षण में प्रारंभिक पैरामीटर को कोड करने की आवश्यकता होगी।इकाई परीक्षण

यदि वाकई कोई इकाई परीक्षण के दौरान config.yml से मानकों के साथ एक सेवा के निर्माण के लिए कोई रास्ता नहीं है, किसी को भी कारण है कि यह एक बुरा बात ™ है के रूप में तर्क पता है?

उत्तर

5

मैं इस पोस्ट पाया, क्योंकि मैं अपने आप को मेरे परीक्षणों में config मानकों की जरूरत है। यह Google पर पहली हिट थी।

हालांकि, यह एक समाधान है जो काम करता है। बेहतर हो सकता है।

<?php 

... 

require_once(__DIR__ . "/../../../../../app/AppKernel.php"); 

class MediaImageTest extends WebTestCase 
{ 
    private $_application; 
    private $storagePath; 

    public function setUp() { 
     $kernel = new \AppKernel('test', true); 
     $kernel->boot(); 
     $this->_application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel); 
     $this->_application->setAutoExit(false) 

     $this->storagePath = $this->_application->getKernel()->getContainer()->getParameter('media_path'); 
    } 

    ... 
} 

आप यह भी करने के लिए दिख सकता है: Access Symfony 2 container via Unit test? एक अधिक स्वच्छ इकाई परीक्षण के भीतर गिरी तक पहुँचने समाधान है।

+3

$ container-> getParameter() जवाब –

2

इकाई परीक्षण अन्य वर्गों से अलगाव में एक वर्ग के परीक्षण के बारे में है। इकाई को आपकी सेवा का परीक्षण करने के लिए आपको कॉन्फ़िगरेशन से कुछ भी पढ़ने की आवश्यकता नहीं है। बस अपने परीक्षण में एक मूल्य पास करें। अंत में, यह संभावित रूप से अन्य मूल्यों के साथ काम कर सकता है, है ना?

बेशक

हो, तो स्वीकार कर लिया मूल्यों के आसपास कुछ तर्क/सत्यापन, तो आप शायद यह परीक्षण द्वारा कवर करना चाहिए। सोचें कि अगर आप कॉन्फ़िगरेशन से यह मान ले रहे थे तो आप इसे कैसे करेंगे। आप बस विभिन्न मूल्यों के साथ व्यवहार का परीक्षण करने में सक्षम नहीं होंगे।

आप सत्यापित करने के लिए करता है, तो आपके आवेदन सही ढंग से काम कर रहा है चाहते हैं, (अपनी कक्षाओं जिस तरह से आप उम्मीद सहयोग) कार्यात्मक परीक्षण या एक स्वीकृति परीक्षण उपकरण (Behat की तरह) का उपयोग करें।

+0

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

+1

तो यह यूनिट परीक्षण बिल्कुल नहीं है। अधिक एकीकरण या सिस्टम परीक्षण। सरलतम चीज जो आप कर सकते हैं सिम्फनी के कार्यात्मक परीक्षणों का उपयोग करना है (जो अभी भी PHPUnit परीक्षण हैं)। कार्यात्मक परीक्षण क्लाइंट में कंटेनर तक पहुंच है (http://symfony.com/doc/2.0/book/testing.html#accessing-internal-objects)। यदि आप अभी भी नियमित यूनिट टेस्ट क्लास का उपयोग करना चाहते हैं, तो अपने यूनिट परीक्षणों में कंटेनर को प्रारंभ करने में देखें: https://gist.github.com/1319290 –

+0

तो आप एक फ़ाइल को डाउनलोड करने वाले वर्ग पर "इकाई" परीक्षण कैसे करते हैं ? क्या इसे हमेशा कार्यात्मक परीक्षण माना जाएगा क्योंकि यह अपने आप से बाहर पहुंचता है? – Craig

8

यह मेरे लिए काम करता है:

class MyServiceTest extends WebTestCase 
{ 
    public function testCookies() 
    { 
     $client = static::createClient(); 

     $myParams = $client->getKernel()->getContainer()->getParameter('my_params'); 
    } 
} 
+1

हालांकि मैं वहाँ इकाई परीक्षण के लिए WebTestCase विस्तार (के रूप में यह आम तौर पर कार्यात्मक परीक्षण के लिए प्रयोग किया जाता है) के साथ किसी भी मुद्दे हैं कि क्या सोच रहा हूँ है – timhc22

0

मैं Symfony 3.2.2 का उपयोग कर रहा है, लेकिन मुझे लगता है कि यह आपके लिए भी काम कर सकता था।

यह बस एक लाइन है:

$export_dir = static::$kernel->getContainer()->getParameter('export_dir'); 
संबंधित मुद्दे