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));
}
}
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 :(
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.