我有一个控制台应用程序(写为Symfony2命令),它通过STDIN
读取来自用户的输入,并在readline
的帮助下,用户输入随后被传递到eval()
整件事只是为了拥有“调试外壳”(类似于php -a
),但是在项目环境和依赖注入容器访问中。
我想为这个命令编写单元测试,但我遇到了障碍,关于如何(以及有可能)为这个行为编写PHPUnit测试吗?
发布于 2012-02-06 10:01:45
我不熟悉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的示例如下
https://stackoverflow.com/questions/9158155
复制相似问题