web-dev-qa-db-ja.com

PHPUnit @ dataProviderは単に機能しません

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

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

_/**
 * Test the createGroup function
 *
 * @return void
 * @author Tomas Sandven <[email protected]>
 *
 * @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関数はコメントの注釈でそれを参照しますが、データプロバイダー関数が呼び出されることはありません。

誰かが理由を知っていますか?

28
Hubro

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

これを修正するには、親コンストラクターを呼び出すだけです。これが私の場合の様子です:

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

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

あなたが本当にそれを必要とするならば、デビッド・ハークネスは正しいヒントを持っていました。コードは次のとおりです。

public function __construct($name = NULL, array $data = array(), $dataName = '') {
    $this->preSetUp();
    parent::__construct($name, $data, $dataName);
}
46
Jon Gilbert

micro_user が作成した点を強調するために、@dataProviderアノテーションはdocblockコメントに含まれている必要があります。つまり、これを行います:

/**
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}

動作しないため、これを行わないでください。

/*
 * @dataProvider myDataProvider
 *
 */
public function testMyMethod(...)
{
  ...
}
10
darrenp

私にとっては、コンストラクターを削除するだけでうまくいきました。クラステスト内で親コンストラクターを呼び出すと、PHPUnitの最新の安定バージョン(6.0.9)でもアノテーションが壊れました。

__constructorにあるコードをユニットテストの実行前に呼び出されるsetUp関数に移動しました。

8
Amaynut

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

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

/**
* @dataProvider providerItCanTest
*//
3
micro_user

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

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

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

2
FtDRbwLXw6

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
1
Arty

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

@hubroが言及しているように、__construct()はPHPUnitアノテーションを壊すので使用しないでください。 ここ はSOトレッドと詳細です。

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

1
sserzant