2012-02-06 15 views
6

मैं एक सांत्वना अनुप्रयोग, (एक Symfony2 आदेश के रूप में लिखा है) कि STDIN के माध्यम से और readline की मदद से उपयोगकर्ता से इनपुट पढ़ रही है के लिए इकाई परीक्षण लिखने के लिए, उपयोगकर्ता इनपुट तो eval()कैसे इंटरैक्टिव सांत्वना एप्लिकेशन

को पारित कर दिया है

पूरी बात सिर्फ "डीबग खोल" (php -a की तरह) के लिए है, लेकिन प्रोजेक्ट एनवी और निर्भरता इंजेक्शन कंटेनर एक्सेस के भीतर है।

मैं इस आदेश के लिए यूनिट-टेस्ट लिखना चाहता हूं लेकिन मैं इस व्यवहार के लिए PHPUnit परीक्षण कैसे लिखता हूं (और यह संभव है) पर दीवार मार रहा हूं?

उत्तर

7

मैं SF2 कमान बात से परिचित नहीं हूँ, लेकिन SF2 डॉक्स, http://symfony.com/doc/2.0/components/console.html#testing-commands

सामान्य में पर यह परीक्षण के बारे में एक उदाहरण है आप अपने कंसोल app से STDIN और STDOUT दसगुणा सकता है, तो आप इसे से बदल सकते हैं एक और स्ट्रीम संसाधन, जैसे fopen(php://memory)readline के बजाय, आप का उपयोग

fwrite($outputStream, 'Prompt'); 
$line = stream_get_line($inputStream, 1024, PHP_EOL); 

विचार असली कंसोल वातावरण की आवश्यकता के बिना अपने घटक परीक्षण योग्य बनाना है। इस दृष्टिकोण का उपयोग करने से आप अपने परीक्षण में किसी भी समय स्ट्रीम की सामग्री की जांच कर सकते हैं। So if you run Command "foo" in your console app and want to test that the output is "bar" you simply rewind the appropriate resource and read it's content। एक विकल्प SplTempFileObject का उपयोग करना होगा।

class ConsoleApp 
… 
    public function __construct($inputStream, $outputStream) 
    { 
     $this->inputStream = $inputStream; 
     $this->outputStream = $outputStream; 
    } 
} 

अपने असली दुनिया परिदृश्य आप

$app = new ConsoleApp(STDIN, STDOUT); 

साथ लेकिन अपने परीक्षण में कंसोल अनुप्रयोग बनाएंगे में आप कर सकते हैं सेटअप अपनी पसंद की एक धारा के साथ ConsoleApp:

public function setup() 
{ 
    $i = fopen('php://memory', 'w'); 
    $o = fopen('php://memory', 'w'); 
    $this->consoleApp = new ConsoleApp($i, $o); 
} 

आउटस्ट्रीम के लिए इस विधि का उपयोग कर यूनिटटेस्ट का एक उदाहरण

+1

ग्रेट धन्यवाद :) – canni

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