インタラクティブコンソールアプリの単体テストを書く方法

I have a console app, (written as a Symfony2 command) that is reading input from user via STDIN and with help of readline, user input is then passed to eval()

すべてのことは、プロジェクトのenvとDependency Injectionコンテナのアクセス内で、( PHP -a のような) "デバッグシェル"を持つためのものです。

私はこのコマンドの単体テストを書こうと思いますが、この動作のためにPHPUnitテストをどのように書くことができますか?

6

1 答え

I'm not familiar with the Sf2 Command thing, but the Sf2 docs have an example about testing it at http://symfony.com/doc/2.0/components/console.html#testing-commands

一般に、 fopen(php:// memory)のような別のストリームリソースと置き換えることができるように、コンソールアプリケーションから STDIN STDOUT /code> readline の代わりに、

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

実際のコンソール環境を必要とせずにコンポーネントをテスト可能にすることです。この方法を使用すると、テスト中のいつでもストリームの内容を確認できます。 したがって、コンソールアプリケーションでCommand "foo"を実行し、出力が "bar"であることをテストする場合は、単に適切なリソースを巻き戻し、その内容を読む。代わりに、 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の例は、

7
追加された
まことにありがとうございます :)
追加された 著者 canni,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com