我有一個控制檯應用程序,(寫成的Symfony2命令)通過STDIN
並與readline
幫助閱讀來自用戶的輸入,用戶輸入然後傳遞到eval()
如何編寫單元測試交互式控制檯應用程序
整個事情只是爲了「調試外殼」(類似於php -a
),但是在項目環境和依賴注入容器訪問中。
我想寫這個命令的單元測試,但我打了牆,關於如何(以及有可能)爲此行爲編寫PHPUnit測試?
我有一個控制檯應用程序,(寫成的Symfony2命令)通過STDIN
並與readline
幫助閱讀來自用戶的輸入,用戶輸入然後傳遞到eval()
如何編寫單元測試交互式控制檯應用程序
整個事情只是爲了「調試外殼」(類似於php -a
),但是在項目環境和依賴注入容器訪問中。
我想寫這個命令的單元測試,但我打了牆,關於如何(以及有可能)爲此行爲編寫PHPUnit測試?
我不熟悉的Sf2的命令的事情,但Sf2的文檔有一個例子,在左右http://symfony.com/doc/2.0/components/console.html#testing-commands
一般測試它,你可以從你的控制檯應用程序分離STDIN
和STDOUT
這樣你就可以將其替換爲另一個流資源,如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的例子是
非常感謝:) – canni 2012-02-06 10:38:09