首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为交互式控制台应用程序编写单元测试

如何为交互式控制台应用程序编写单元测试
EN

Stack Overflow用户
提问于 2012-02-06 09:38:14
回答 1查看 2.7K关注 0票数 6

我有一个控制台应用程序(写为Symfony2命令),它通过STDIN读取来自用户的输入,并在readline的帮助下,用户输入随后被传递到eval()

整件事只是为了拥有“调试外壳”(类似于php -a),但是在项目环境和依赖注入容器访问中。

我想为这个命令编写单元测试,但我遇到了障碍,关于如何(以及有可能)为这个行为编写PHPUnit测试吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-06 10:01:45

我不熟悉Sf2命令,但Sf2文档中有一个关于在http://symfony.com/doc/2.0/components/console.html#testing-commands中测试它的示例

通常,您可以将STDINSTDOUT与您的控制台应用程序解耦,这样您就可以用另一个流资源来替换它,比如fopen(php://memory)。而不是readline,您可以使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ConsoleApppublic function __construct($inputStream, $outputStream)
    {
        $this->inputStream = $inputStream;
        $this->outputStream = $outputStream;
    }
}

在您的真实场景中,您将使用以下命令创建控制台应用程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$app = new ConsoleApp(STDIN, STDOUT);

但在您的测试中,您可以使用您选择的流设置ConsoleApp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function setup()
{
    $i = fopen('php://memory', 'w');
    $o = fopen('php://memory', 'w');
    $this->consoleApp = new ConsoleApp($i, $o);
}

对出流使用此方法的UnitTest的示例如下

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9158155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文