【问题标题】:How to test console input with PHPUnit (readline function)如何使用 PHPUnit 测试控制台输入(readline 函数)
【发布时间】:2020-03-06 03:28:47
【问题描述】:

我正在创建一个库,我想测试一个通过控制台输入询问用户的系统。我使用PHPUnit 作为测试库,但我不知道如何执行readline 函数,然后打印一个文本来回答输入以对其进行测试。

这是我的测试:

$app = new Application;
$i = null;
$app->registerCommand('test', function(Input $input) use(&$i){
    // $input->getInput() asks the user and returns the value
    $i = $input->getInput();
});

$this->expectOutputString("\n");
// Run the application, so asks the user to enter a value
$app->run();
// Here, I want force to enter a value by the code
$this->assertSame($i, 'test');

我已测试将readline 替换为fgets(STDIN),但没有结果。我想用异步调用来解决这个问题,但我需要使用好的库的指南。

这是我在getInput 函数中测试的不同方式:

return readline();
return trim(fgets(STDIN));

感谢您的帮助。

【问题讨论】:

  • 无论 Application 是什么(您没有在问题中分享),它是否有任何方法可以提供输入?否则你总是需要在运行测试时手动输入一些东西,这会导致自动化测试失败......

标签: php testing input console phpunit


【解决方案1】:

尝试用您自己的函数替换使用 read 行或一些 3rd 方提示命令,并使用以下命令:

你可以在 php 中手动读取键盘输入:

$fp = fopen("php://stdin", "r");
$input = rtrim(fgets($fp, 1024));

注意带有 std 输入的字符串用作输入流。 然后在测试时用这样的文件替换输入流

$fp = fopen(__DIR__ . '/../test/test_input', "r");
$input = rtrim(fgets($fp, 1024));

这一次它将改为从文件中读取一行。

显然,您必须在测试期间创建一个函数和某种方法来交换输入流字符串,但以上就是让它工作所需的全部内容。

这是一个工作单元测试:

class PromptTest extends TestCase
{

    public function testPrompt()
    {
        $fp = fopen(__DIR__ . '/../test/test_input', "r");
        $rtrim = rtrim(fgets($fp, 1024));
        self::assertEquals('first line of file', $rtrim);
    }
}

这产生了 OK (1 test, 1 assertion)

还可以在这里找到:Is there a way to access a string as a filehandle in php? 可以使用字符串输入。

【讨论】:

    猜你喜欢
    • 2016-11-28
    • 2015-06-07
    • 1970-01-01
    • 2021-07-21
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多