Saya punya objek tiruan PHPUnit yang mengembalikan 'return value'
apa pun argumennya:
// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
->method('methodToMock')
->will($this->returnValue('return value'));
Apa yang ingin saya lakukan adalah mengembalikan nilai yang berbeda berdasarkan argumen yang diteruskan ke metode mock. Saya sudah mencoba sesuatu seperti:
$mock = $this->getMock('myObject', 'methodToMock');
// methodToMock('one')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('one'))
->will($this->returnValue('method called with argument "one"'));
// methodToMock('two')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('two'))
->will($this->returnValue('method called with argument "two"'));
Tapi ini menyebabkan PHPUnit mengeluh jika mock tidak dipanggil dengan argumen 'two'
, jadi saya berasumsi bahwa definisi methodToMock('two')
menimpa definisi yang pertama.
Jadi pertanyaan saya adalah: Apakah ada cara untuk mendapatkan objek tiruan PHPUnit untuk mengembalikan nilai yang berbeda berdasarkan argumennya? Dan jika demikian, bagaimana caranya?
sumber
$this->returnCallback(array('MyClassTest','myCallback'))
.$this->returnCallback(function() { // ... })
Dari dokumen phpUnit terbaru: "Kadang-kadang metode stubbed harus mengembalikan nilai yang berbeda tergantung pada daftar argumen yang telah ditentukan. Anda dapat menggunakan returnValueMap () untuk membuat peta yang mengaitkan argumen dengan nilai balik yang sesuai."
sumber
Saya memiliki masalah yang sama (walaupun sedikit berbeda ... Saya tidak perlu nilai pengembalian yang berbeda berdasarkan argumen, tetapi harus menguji untuk memastikan 2 set argumen diteruskan ke fungsi yang sama). Saya menemukan sesuatu yang seperti ini:
Ini tidak sempurna, karena mengharuskan urutan 2 panggilan ke foo () diketahui, tetapi dalam praktiknya ini mungkin tidak terlalu buruk.
sumber
Anda mungkin ingin melakukan panggilan balik dengan cara OOP:
sumber
Bukan apa yang Anda minta, tetapi dalam beberapa kasus dapat membantu:
onConsecutiveCalls - mengembalikan daftar nilai dalam urutan yang ditentukan
sumber
Lewati dua level array, di mana setiap elemen adalah array dari:
contoh:
sumber
Anda juga dapat mengembalikan argumen sebagai berikut:
Seperti yang dapat Anda lihat di dokumentasi Mocking , metode ini
returnValue($index)
memungkinkan untuk mengembalikan argumen yang diberikan.sumber
Maksud Anda sesuatu seperti ini?
sumber
Saya memiliki masalah serupa yang tidak bisa saya selesaikan juga (hanya ada sedikit informasi tentang PHPUnit). Dalam kasus saya, saya hanya membuat setiap tes terpisah dengan input yang dikenal dan output yang dikenal. Saya menyadari bahwa saya tidak perlu membuat objek tiruan jack-of-all-trade, saya hanya membutuhkan satu spesifik untuk tes tertentu, dan dengan demikian saya memisahkan tes dan dapat menguji aspek individu dari kode saya sebagai terpisah satuan. Saya tidak yakin apakah ini mungkin berlaku untuk Anda atau tidak, tetapi hanya itu yang perlu Anda uji.
sumber
sumber
Coba:
sumber