12

FWIW SimpleTest 1.1alpha を使用しています。

シングルトン クラスがあり、クラスのインスタンス化を試みることによってクラスがシングルトンであることを保証する単体テストを作成したいと考えています (プライベート コンストラクターがあります)。

これは明らかに致命的なエラーを引き起こします:

致命的なエラー: プライベート FrontController::__construct() への呼び出し

その致命的なエラーを「キャッチ」して、合格したテストを報告する方法はありますか?

4

3 に答える 3

13

いいえ。致命的なエラーにより、スクリプトの実行が停止します。

そして、そのようにシングルトンをテストする必要はありません。コンストラクターがプライベートかどうかを確認する必要がある場合は、ReflectionClass:getConstructor()を使用できます。

public function testCannotInstantiateExternally()
{
    $reflection = new \ReflectionClass('\My\Namespace\MyClassName');
    $constructor = $reflection->getConstructor();
    $this->assertFalse($constructor->isPublic());
}

考慮すべきもう1つのことは、シングルトンクラス/オブジェクトは、モックするのが難しいため、TTDの障害になるということです。

于 2011-01-20T23:24:15.807 に答える
5

Mchl の回答の完全なコード スニペットを次に示します。これにより、人々はドキュメントを確認する必要がなくなります...

public function testCannotInstantiateExternally()
{
    $reflection = new \ReflectionClass('\My\Namespace\MyClassName');
    $constructor = $reflection->getConstructor();
    $this->assertFalse($constructor->isPublic());
}
于 2014-08-29T06:30:48.080 に答える
3

PHPUnit のプロセス分離のような概念を使用できます。

これは、テスト コードが php のサブプロセスで実行されることを意味します。この例は、これがどのように機能するかを示しています。

<?php

// get the test code as string
$testcode = '<?php new '; // will cause a syntax error

// put it in a temporary file
$testfile = tmpfile();
file_put_contents($testfile, $testcode);

exec("php $tempfile", $output, $return_value);

// now you can process the scripts return value and output
// in case of an syntax error the return value is 255
switch($return_value) {
    case 0 :
        echo 'PASSED';
        break;
    default :
        echo 'FAILED ' . $output;

}

// clean up
unlink($testfile);
于 2012-12-20T22:28:20.757 に答える