31

このトピックに関するドキュメントを読みましたが、コードはデータ プロバイダーの実装のすべての要件に従っています。まず、関連する場合に備えて、テストの完全なコードを次に示します。

データプロバイダーを実装する関数は次のとおりです。

/**
 * Test the createGroup function
 *
 * @return void
 * @author Tomas Sandven <tomas191191@gmail.com>
 *
 * @dataProvider provideFileImportTests_good
 **/
public function testCreateGroup($file, $groupname, $group, $mapping)
{
    // Create a test group
    $id = $this->odm->createGroup($groupname, $group);

    // Try to load it back out
    $result = R::load(OmniDataManager::TABLE_GROUP, $id);

    // Check that the result is not null
    $this->assertFalse(is_null($result));

    return $id;
}

PHPUnit は単に失敗します:

tests\broadnet\broadmap\OmniDataManagerTest::testCreateGroup() の引数 1 がありません

die();データ プロバイダー関数内でアプリケーション ( ) を強制終了しようとしましたが、実行されません。データ プロバイダー関数は同じクラスで公開されており、関数名にタイプミスはなく、関数testCreateGroupはコメント内の注釈でそれを参照していますが、データ プロバイダー関数は呼び出されません。

理由を知っている人はいますか?

4

8 に答える 8

74

最後に、このテスト ファイルを何時間も調べた結果、コンストラクター関数を定義するだけでデータ プロバイダーの機能が損なわれることがわかりました。知っておくと良い。

これを修正するには、親コンストラクターを呼び出すだけです。私の場合は次のようになりました。

public function __construct()
{
    // Truncate the OmniDataManager tables
    R::wipe(OmniDataManager::TABLE_GROUP);
    R::wipe(OmniDataManager::TABLE_DATA);

    parent::__construct();   // <- Necessary
}

David HarknessVasilyがコメントで指摘したように、コンストラクターのオーバーライドは、基本クラスのコンストラクターの呼び出しシグネチャと一致する必要があります。私の場合、基本クラスのコンストラクターは引数を必要としませんでした。これがphpunitの新しいバージョンで変更されたばかりなのか、ユースケースに依存するのかはわかりません。

いずれにせよ、Vasily の例の方が適切に機能する可能性があります。

public function __construct($name = null, array $data = array(), $dataName = '')
{
    // Your setup code here

    parent::__construct($name, $data, $dataName)
}
于 2012-04-16T15:53:41.780 に答える
49

本当に必要な場合は、David Harkness が適切なヒントを提供してくれました。コードは次のとおりです。

public function __construct($name = NULL, array $data = array(), $dataName = '') {
    $this->preSetUp();
    parent::__construct($name, $data, $dataName);
}
于 2013-05-02T07:19:25.887 に答える
7

dataProvider のスペルが正しいことを確認してください... @dataProvidorvs@dataProvider

データ プロバイダーを必要とするテスト関数では、次を含む docblock が必要です。

/**
* @dataProvider providerItCanTest
*//
于 2016-03-31T17:27:41.457 に答える
3

このエラーは、データ プロバイダー メソッドが返すデータ配列の少なくとも 1 つが空であることを意味します。例えば:

public function dataProvider() {
    return array(
        array(1, 2, 3),
        array(),           // this will cause a "Missing argument 1" error
        array(4, 5, 6)
    );
}

データ配列を動的に生成しているため、データ ソースをデバッグし、その理由を解明する必要があります。

于 2012-04-16T15:36:22.603 に答える
2

dataProvider アノテーションの何が問題なのかを突き止めるのに何時間も費やしました。まったく呼び出されませんでした。

私の場合、問題は opcache でした。php.ini をチェックして、opcache.save_comments が有効になっていることを確認します。

php -r "phpinfo();" | grep opcache.save_comments

これを有効にするには、これを php.ini (または、私の場合は、liip.ch から osx に php を使用しているため、/usr/local/php5/php.d/20-extension-opcache.ini) に追加します。

[opcache]
opcache.save_comments=1
于 2019-03-17T11:33:23.487 に答える
1

まだグーグルからここに来ている人へこんにちは:)私はPHP 7.0.5とPHPUnit 5.3.2を使用しています。

@hubro が言及している__construct()ように、一部の PHPUnit 注釈が壊れるため、使用しないでください。ここに、より詳細な SO トレッドがあります。

私のテストのクラス は、をMyStuffTest拡張します。使用され、同じエラーが発生しました。代わりに、すべてのテストケース間で共有される静的データをセットアップするために使用する必要があります-db接続など、. DataProvider が動作するようになりました。MyFancyTestcasePHPUnit_Framework_TestCaseMyFancyTestcase__construct()setupBeforeClass()__construct()

于 2016-05-03T08:23:52.997 に答える