38

簡単に言うと、テストを実行するときにphpunitは複数のデータプロバイダーを使用できますか?

たとえば、getById というメソッドがあり、成功したテストケースと失敗したテストケースの両方を実行する必要があります。

成功したテストケースは、対応するレコードを返すことができることを意味します。失敗した場合、入力は無効と失敗の 2 つのカテゴリに分類されます。

無効は入力が正当でないことを意味し、失敗は入力が有効である可能性があるが、その ID に対応するレコードがないことを意味します。

したがって、コードは次のようになります。

/** 
 * @dataProvider provideInvalidId
 * @dataProvider provideFailedId
 */
public function testGetByIdUnsuccess($id)
{   
    $this->assertNull($this->model->getById($id));
}   

しかし、最初のデータ プロバイダーのみが使用され、2 番目のデータ プロバイダーは無視されていることが判明しました。このシナリオが一般的かどうかはわかりませんが、ここで質問です。複数のデータプロバイダーを使用できますか? できるとしたら、どうやって?

PS:ここではあまり助けが見つかりませんでした

4

5 に答える 5

31

質問の更新だけで、プルリクエストが受け入れられ、コードが次のようになりました。

/** 
 * @dataProvider provideInvalidId
 * @dataProvider provideFailedId
 */
public function testGetByIdUnsuccess($id)
{   
    $this->assertNull($this->model->getById($id));
}

PHPUnit 5.7 で動作し、必要な数のプロバイダーを追加できます。

于 2016-10-09T14:21:16.310 に答える
3

複数の dataProvider を必要とせずに、dataProvider 配列にコメントを追加して、同じ機能を提供できます。

public static function DataProvider()
{
    return array(
        'Invalid Id'      => array(123),
        'Failed Id'       => array(321),
        'Id Not Provided' => array(NULL),
);
}
于 2013-02-28T02:23:01.003 に答える
2

データプロバイダーを相互に組み合わせて使用​​できるCrossDataProvidersを使用することもできます

<?php

/** 
 * @dataProvider provideInvalidIdAndValues
 */
public function testGetByIdUnsuccess($id, $value)
{   
    $this->assertNull($this->model->getById($id));
}   

function provideInvalidIdAndValues() {
    return DataProviders::cross(
        [[1], [2], [3]],
        [['Rob'], ['John'], ['Dennis']]
    );
}
于 2019-06-07T13:03:23.697 に答える
0

まあ、あなたはそれを別の側面から考えることができます;)あなたはあなたが期待していることを正確に知っています.

$dataProvider = array(1, 'unexpected');

次に、次のようなテスト方法:

public function testGetById($id) {
    $this->assertEquals($result_expected, $obj::getById($id));
}

したがって、テスト結果は次のとおりです。

.F
于 2016-07-01T01:46:26.033 に答える