Phpunit: Tidak dapat meneruskan parameter dengan @dataProvider + @depends

Dibuat pada 26 Feb 2011  ·  10Komentar  ·  Sumber: sebastianbergmann/phpunit

Saya berharap kode di bawah ini tidak mengembalikan kegagalan. Tetapi pada testDataReceiver(), $a akan menjadi null secara tidak terduga. Saya tidak yakin apakah itu bug. Adakah yang bisa menguji kode ini atau memperbaiki kode saya? Terima kasih.

PHPUnit 3.5.11, PHP 5.3.3

<?php

class DataProviderTest extends PHPUnit_Framework_TestCase
{
    const TEST_NUM = 7;
    /**
     *  <strong i="7">@dataProvider</strong> provider
     */
    public function testDataProvider($a)
    {
        $this->assertTrue($a === self::TEST_NUM);
        return $a;
    }
    /**
     *  <strong i="8">@depends</strong> testDataProvider
     */
    public function testDataReceiver($a)
    {
        // somehow $a will be null
        $this->assertTrue($a === self::TEST_NUM);
    }
    public function provider()
    {
        return array(array(self::TEST_NUM));
    }
}

Komentar yang paling membantu

Saya memahami penjelasan yang diberikan oleh @elblinkin yang menjelaskan mengapa perilaku yang diharapkan @nobuf berbeda dari perilaku phpunit yang sebenarnya.
Tetapi dari sudut pandang saya, @depends harus memahami bahwa testDataProvider akan "dikloning" dan dijalankan beberapa kali sehingga testDataReceiver harus dijalankan juga beberapa kali: setiap kali testDataProvider dijalankan dengan kumpulan data yang diberikan, maka testDataReceiver harus dijalankan dengan testDataProvider yang dikembalikan data sebagai masukan.

Semua 10 komentar

Anotasi @dataProvider dihitung sebelum eksekusi pengujian. Pada dasarnya, fase pra-pengujian membuat metode pengujian untuk setiap set parameter yang disediakan oleh penyedia data. @depends bergantung pada apa yang pada dasarnya merupakan prototipe dari pengujian berbasis data, jadi @depends dalam satu cara adalah pada pengujian yang tidak ada (tidak dijalankan).

Cara lain untuk memikirkannya, adalah jika penyedia memasok lebih dari satu set parameter. PHPUnit akan membuat banyak metode testDataProvider tetapi tidak akan ada banyak metode testDataReceiver karena tidak ada metode @dataProvider pada metode pengujian itu untuk fase pra-pengujian.

Namun Anda dapat memiliki @depends dan @dataProvider pada metode pengujian yang sama. Berhati-hatilah untuk mendapatkan urutan parameter yang benar, meskipun dalam kasus ini mungkin tidak ada parameter pertama.

Terima kasih atas penjelasannya. Itu masuk akal. Menghargai itu.

Hai, sebenarnya ada pola untuk membangun dependensi pengujian menjadi penyedia data menggunakan @depends & @dataProvider. http://beagile.biz/nested-data-provider-with-dependency-in-phpunit/

Saya memahami penjelasan yang diberikan oleh @elblinkin yang menjelaskan mengapa perilaku yang diharapkan @nobuf berbeda dari perilaku phpunit yang sebenarnya.
Tetapi dari sudut pandang saya, @depends harus memahami bahwa testDataProvider akan "dikloning" dan dijalankan beberapa kali sehingga testDataReceiver harus dijalankan juga beberapa kali: setiap kali testDataProvider dijalankan dengan kumpulan data yang diberikan, maka testDataReceiver harus dijalankan dengan testDataProvider yang dikembalikan data sebagai masukan.

kenapa ini ditutup?
Saya juga berpendapat bahwa @depends harus mengetahui @dataprovider dari metode uji dependet.

Ada yang berubah dalam hal itu? Apakah ada cara untuk menjalankan @depends dengan @dataProvider tanpa mengulang pengujian di dalam?

Bisakah kita membuka kembali masalah ini?
Tampak seperti kasus penggunaan yang sah

Masalah ini tidak boleh ditutup.
Masih menjadi masalah pada @depends yang tidak memberikan data pengembalian ke pengujian dependen.
Saya menghadapi bagaimana saya bisa mendapatkan kembalinya tes sebagai input untuk dependen, tetapi Jika saya menggunakan @dataProvider pada tes pertama, dependennya hanya menerima NULL sebagai input.

Masalah ini tidak boleh ditutup.
Masih menjadi masalah pada @depends yang tidak memberikan data pengembalian ke pengujian dependen.
Saya menghadapi bagaimana saya bisa mendapatkan kembalinya tes sebagai input untuk dependen, tetapi Jika saya menggunakan @dataProvider pada tes pertama, dependennya hanya menerima NULL sebagai input.

@temple - itu benar dan saya ingin tahu belum ada solusi konkret untuk ini.

Baru saja mulai menulis tes baru-baru ini dan segera masuk ke bug ini. Sangat aneh itu masih belum terselesaikan dan tidak ada solusi yang baik. Jadi sekarang saya harus menulis ulang pengujian saya menjadi sesuatu yang jelek tanpa penyedia data dan dengan pesan kesalahan khusus.

Kasus saya (contoh sederhana):

class MyTest extends TestCase
{
    public function cache100(): array
    {
        return [/* 100 values here */];
    }

    /**
     * <strong i="7">@dataProvider</strong> cache100
     * <strong i="8">@param</strong> array $entry
     * <strong i="9">@return</strong> array
     */
    public function testA(array $entry): array
    {
        //some heavy calculation here...
        return [/* result */];
    }

    /**
     * <strong i="10">@dataProvider</strong> cache100
     * <strong i="11">@param</strong> array $entry
     * <strong i="12">@return</strong> array
     */
    public function testB(array $entry): array
    {
        //some heavy calculation here...
        return [/* result */];
    }

    /**
     * <strong i="13">@dataProvider</strong> cache100
     * <strong i="14">@depends</strong>      testA
     * <strong i="15">@depends</strong>      testB
     */
    public function testC(array $entry, array $valueA, array $valueB)
    {
        $valueC = $valueA * $valueB;
    }
}

Sekarang saya pikir satu-satunya cara untuk membuatnya berfungsi adalah menolak dari dataProviders di testA dan testB dan menulis ulang kode menjadi loop. Tapi ini jelek :(

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

stephen-leavitt-sonyatv-com picture stephen-leavitt-sonyatv-com  ·  4Komentar

sebastianbergmann picture sebastianbergmann  ·  4Komentar

greg0ire picture greg0ire  ·  4Komentar

joubertredrat picture joubertredrat  ·  4Komentar

stemis picture stemis  ·  3Komentar