このトピックに関するドキュメントを読みました。私のコードは、データプロバイダー実装のすべての要件に従います。まず第一に、 これがテストの完全なコードです 関連する場合に備えて。
データプロバイダーを実装する関数は次のとおりです。
_/**
* 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
関数はコメントの注釈でそれを参照しますが、データプロバイダー関数が呼び出されることはありません。
誰かが理由を知っていますか?
最後に、このテストファイルを何時間もプロデュースした後、コンストラクター関数を定義するだけでデータプロバイダーの機能が損なわれることに気付きました。知っておくと良い。
これを修正するには、親コンストラクターを呼び出すだけです。これが私の場合の様子です:
public function __construct()
{
// Truncate the OmniDataManager tables
R::wipe(OmniDataManager::TABLE_GROUP);
R::wipe(OmniDataManager::TABLE_DATA);
parent::__construct(); // <- Necessary
}
あなたが本当にそれを必要とするならば、デビッド・ハークネスは正しいヒントを持っていました。コードは次のとおりです。
public function __construct($name = NULL, array $data = array(), $dataName = '') {
$this->preSetUp();
parent::__construct($name, $data, $dataName);
}
micro_user が作成した点を強調するために、@dataProvider
アノテーションはdocblockコメントに含まれている必要があります。つまり、これを行います:
/**
* @dataProvider myDataProvider
*
*/
public function testMyMethod(...)
{
...
}
動作しないため、これを行わないでください。
/*
* @dataProvider myDataProvider
*
*/
public function testMyMethod(...)
{
...
}
私にとっては、コンストラクターを削除するだけでうまくいきました。クラステスト内で親コンストラクターを呼び出すと、PHPUnitの最新の安定バージョン(6.0.9)でもアノテーションが壊れました。
__constructor
にあるコードをユニットテストの実行前に呼び出されるsetUp
関数に移動しました。
DataProviderのスペルが正しいことを確認してください...@dataProvidor
vs @dataProvider
データプロバイダーを必要とするテスト関数では、以下を含むdocblockが必要です。
/**
* @dataProvider providerItCanTest
*//
このエラーは、データプロバイダーメソッドが返すデータ配列の少なくとも1つが空であることを意味します。例えば:
public function dataProvider() {
return array(
array(1, 2, 3),
array(), // this will cause a "Missing argument 1" error
array(4, 5, 6)
);
}
データ配列を動的に生成しているため、データソースをデバッグし、その理由を理解する必要があります。
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
まだグーグルからここに来ている人にこんにちは:)私はPHP 7.0.5とPHPUnit5.3.2を使用しています。
@hubroが言及しているように、__construct()
はPHPUnitアノテーションを壊すので使用しないでください。 ここ はSOトレッドと詳細です。
私のテストのクラスMyStuffTest
は、_PHPUnit_Framework_TestCase
_を拡張するMyFancyTestcase
を拡張します。 MyFancyTestcase
は__construct()
を使用しましたが、同じエラーが発生しました。代わりにsetupBeforeClass()
を使用して、すべてのテストケース間で共有される静的データをセットアップする必要があります-db接続など。__construct()
は必要ありません。 DataProviderが機能するようになりました。