2

シェルとのやり取りを担当するクラスがありますが、このような関数をPHPUnitでテストする方法はありますか?

public function runCommand($command, $stdin = null)
{
    $descriptorspec = array(
        array("pipe", "r"), // stdin
        array("pipe", "w"), // stdout
        array("pipe", "w"), // stderr
    );

    $environment = array();

    $proc = proc_open(
        $command,
        $descriptorspec,
        $pipes,
        __DIR__,
        $environment
    );

    if (!is_resource($proc)) {
        return false;
    }

    if ($stdin !== null) {
        fwrite($pipes[0], $stdin);
        fclose($pipes[0]);
    }

    $result = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    if (proc_close($proc) !== 0) {
        return false;
    }

    return $result;
}
4

1 に答える 1

3

質問を投稿した直後に頭に浮かんだことは次のとおりです。Linux でテストしているので、bash スクリプトを作成しました。

#!/bin/bash
echo -ne "exec_works"

そして、テストで実行しました:

public function testShellExecution()
{
    // root tests directory constant, set in PHPUnit bootstrap file
    $path = TESTDIR . "/Resources/exec_test.sh";

    $this->assertEquals(
        "exec_works",
        $this->shellCommander->runCommand("bash $path")
    );
}

欠点は、このようなテストは Linux 環境でのみパスすることです (MAC を使用したことがないため、bash スクリプトを実行するかどうかはわかりません)。ただし、Windows では bash スクリプトをネイティブに実行できないため、Windows では確実に失敗します。

これに対する解決策は、すべての OS に対して実行可能なスクリプトを作成し、どの OS サーバーが使用するかをテスト チェックして適切なスクリプトを実行することです。

于 2013-02-16T14:55:25.727 に答える