20

1つのテストがaを介して複数回実行され@dataProvider、別のテストが@depends最初のメソッドで実行されるテストクラスがあります。しかし、var_dump2番目のテストに合格する必要があるものを要求したとき、それは私に私が予期NULLしていなかった堅実なものを与えます。

言い換えれば、これは何をすべきか:

<?php 
class DevicesTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider registerDataProvider
     */
    public function testRegister($device, $supposedResult)
    {
        //do a bunch of tests
        return array($device, $supposedResult);
    }

    public function registerDataProvider()
    {
        return array(array("foo", "foo"));
    }

    /**
     * @depends testRegister
     */
    public function testSaveDevicePreferences($deviceArr)
    {
        $this->assertNotEmpty($deviceArr);
    }
}
?>
4

3 に答える 3

13

通常@dataProvider、それぞれ異なるデータ セットでテストを複数回実行する場合に使用します。これは、テストでループするコードを書く手間を省き、異なるデータ セットが個別に合格または不合格になるようにするために存在します。

コメントで述べたように、PHPUnit は または のいずれ@depends @dataProviderを使用すると思います。あなたの例から、2 番目が勝つと思います。もう 1 つの可能性は、PHPUnit が選択するテストとデータセットを認識できないため、データ プロバイダーを使用したテストを依存関係として使用できないことです。

単一のデータセットを返すためregisterDataProvider、テスト自体から簡単に呼び出すことができます。これにより@depends、2 番目のテストで@dataProvider. および/またはtestRegisterを変更する必要があると仮定すると、これは機能するはずです:$device$supposedResult

class DevicesTest extends PHPUnit_Framework_TestCase {
    public function testRegister() {
        list($device, $supposedResult) = $this->registerDataProvider();
        //do a bunch of tests
        //register a device in the DB
        return array($device, $supposedResult);
    }

    public function registerDataProvider() {
        return array("foo", "foo");
    }

    /**
     * @depends testRegister
     */
    public function testSaveDevicePreferences($data) {
        list($device, $supposedResult) = $data;
        // do stuff dependent on testRegister()
        $this->assertEquals($device, $supposedResult);
    }
}

これらの変数を最初のテストで変更する必要がない場合はregisterDataProvider、両方のテストから単純に呼び出すことができます。PHPUnit は、データ プロバイダー メカニズムのように、依存するテストから返された配列を依存するテストの引数に分離しないことに注意してください。これは、返される配列が単一の引数に対して複数の引数であることを認識していないためです。

于 2012-05-23T15:51:22.977 に答える
0

いいえ、これは不可能であることがわかりました。ただし、テストクラスを少し変更することで、基本的に同じ結果が得られました。ただし、最初のテストが失敗した場合、2番目のテストが正常に実行されるという点で、依存関係が失われているようです。

<?php 
class DevicesTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider registerDataProvider
     */
    public function testRegister($device, $supposedResult)
    {
        //do a bunch of tests
        //register a device in the DB
        return array($device, $supposedResult);
    }

    public function registerDataProvider()
    {
        return array(array("foo", "foo"));
    }

    /**
     * @depends testRegister
     * @dataProvider registerDataProvider
     */
    public function testSaveDevicePreferences($device, $supposedResult)
    {
        // do stuff dependent on testRegister()
        $this->assertEquals($device, $supposedResult);
    }
}
?>
于 2012-05-22T19:15:55.747 に答える