2012-02-06 47 views
6

我有一個控制檯應用程序,(寫成的Symfony2命令)通過STDIN並與readline幫助閱讀來自用戶的輸入,用戶輸入然後傳遞到eval()如何編寫單元測試交互式控制檯應用程序

整個事情只是爲了「調試外殼」(類似於php -a),但是在項目環境和依賴注入容器訪問中。

我想寫這個命令的單元測試,但我打了牆,關於如何(以及有可能)爲此行爲編寫PHPUnit測試?

回答

7

我不熟悉的Sf2的命令的事情,但Sf2的文檔有一個例子,在左右http://symfony.com/doc/2.0/components/console.html#testing-commands

一般測試它,你可以從你的控制檯應用程序分離STDINSTDOUT這樣你就可以將其替換爲另一個流資源,如fopen(php://memory)。取而代之的readline,您使用

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

的想法就是讓你的組件可測試,而不需要真正的控制檯環境。使用這種方法,您可以隨時在測試中檢查Stream的內容。 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); 
} 

使用這種方法進行流出的UnitTest的例子是

+1

非常感謝:) – canni 2012-02-06 10:38:09

相關問題