31

PHPUnit がこのコードで最後の例外アサーションを行わないのはなぜですか?

public function testConfigOverriding()
{
    $this->dependencyContainer = new DependencyContainer(__DIR__ . "/../../Resources/valid_json.json");
    $this->assertEquals('overriden', $this->dependencyContainer->getConfig('shell_commander')['pygmentize_command']);

    $unexisting = "unexisting_file";
    $this->setExpectedException('Exception', "Configuration file at path \"$unexisting\" doesn't exist.");
    $this->dependencyContainer = new DependencyContainer($unexisting);

    $invalid = __DIR . "/../../Resources/invalid_json.json";
    $this->setExpectedException('Exception', "Configuration JSON file provided is not valid.");
    $this->dependencyContainer = new DependencyContainer($invalid);
}

つまり、基本的には、「unexsisting_file」例外がスローされたかどうかをテストしますが、「無効な json」テストを完全に無視します。スローされた例外ごとに個別のテストを行う必要がありますか?

4

6 に答える 6

57

を使用してもsetExpectedException、テストは通常​​のPHPコードであり、PHPの通常のルールに従います。try例外がスローされた場合、プログラムフローは、 /catchブロックに到達するまで、現在のコンテキストからすぐにジャンプします。

PHPUnitでは、を使用するsetExpectedExceptionと、実行しようとしているコードからの例外を予期する必要がある場合に、PHPUnitのコアに通知します。したがって、try/catchブロックで待機しcatch、予期しているタイプの例外でが呼び出された場合はテストに合格します。

ただし、テストメソッド内では、通常のPHPルールが引き続き適用されます。例外が発生すると、それが現在のコードブロックの終わりになります。テストメソッド内に独自のtry/ブロックがない限り、そのメソッドではそれ以上何も実行されません。catch

したがって、複数の例外をテストするには、いくつかのオプションがあります。

  1. テストメソッドに独自のtry/catchを追加して、最初の例外の後でそのメソッド内でさらにテストを続行できるようにします。

  2. テストを個別のメソッドに分割して、各例外が独自のテストに含まれるようにします。

  3. dataProviderこの特定の例は、基本的に2つのデータセットで同じ機能をテストしているため、PHPUnitのメカニズムを使用するのに適したケースのように見えます。このdataProvider機能を使用すると、テストする値のセットごとに入力データの配列を含む個別の関数を定義できます。これらの値は、一度に1セットずつテストメソッドに渡されます。コードは次のようになります。

    /**
     * @dataProvider providerConfigOverriding
     */
    public function testConfigOverriding($filename, $expectedExceptionText) {
        $this->dependencyContainer = new DependencyContainer(__DIR__ . "/../../Resources/valid_json.json");
        $this->assertEquals('overriden', $this->dependencyContainer->getConfig('shell_commander')['pygmentize_command']);
    
        $this->setExpectedException('Exception', $expectedExceptionText);
        $this->dependencyContainer = new DependencyContainer($filename);
    }
    
    public function providerConfigOverriding() {
        return array(
            array('unexisting_file', 'Configuration file at path "unexisting_file" doesn\'t exist.'),
            array(__DIR__ . "/../../Resources/invalid_json.json", "Configuration JSON file provided is not valid."),
        );
    }
    

お役に立てば幸いです。

于 2013-01-28T13:45:45.460 に答える
0

まず、タイプミスがあります。交換

__DIR

__DIR__

:)


@SDC のコメントのおかげで、( expectedExceptionPHPUnit の機能を使用している場合) 例外ごとに個別のテスト メソッドが実際に必要になることに気付きました。コードの 3 番目のアサーションは実行されていません。1 つのテスト メソッドで複数の Exception をテストする必要がある場合はtry catch、テスト メソッドに独自のステートメントを記述することをお勧めします。

ありがとう@SDC

于 2013-01-28T12:23:51.497 に答える