Bosan mengingat perbedaan antara ejekan, parsial, dan mata-mata di Mockery? Ya, itulah sebabnya saya membuat double()
- metode pembantu sederhana untuk membuat penggunaan Mockery lebih mudah.
Saat menulis tes saya tidak ingin memikirkan perbedaan antara fakes , mocks , dan spies . Saya hanya membuat tes umum ganda dan fokus menulis tes saya. Generalisasi ini umum terjadi pada kerangka pengujian lain seperti RSpec, td.js, dan lainnya.
Untuk menginstal versi terbaru dari helper double()
, jalankan perintah:
composer require --dev jasonmccreary/test-double
Kapan pun Anda perlu membuat tes ganda, cukup panggil double()
Secara default, double()
mengembalikan objek yang memungkinkan Anda mematikan metode serta memverifikasi pemanggilan metode.
<?php
$ td = double ();
$ td -> shouldReceive ( ' someMethod ' )-> andReturn ( 5 );
$ td -> someMethod (); // returns 5
$ td -> unstubbedMethod (); // returns null, does not throw an exception
$ td -> anotherMethod ();
$ td -> shouldHaveReceived ( ' anotherMethod ' );
Di Mockery, pengujian ganda ini setara dengan Mockery::mock()->shouldIgnoreMissing()
atau, dalam versi terbaru, Mockery::spy()
.
Anda juga dapat meneruskan double()
referensi ke kelas atau antarmuka. Ini akan membuat objek pengujian yang memperluas kelas atau mengimplementasikan antarmuka. Hal ini memungkinkan dobel untuk meneruskan petunjuk tipe apa pun atau pemeriksaan tipe apa pun dalam implementasi Anda.
<?php
$ td = double (Str::class);
$ td -> shouldReceive ( ' length ' )-> andReturn ( 5 );
$ td -> length (); // 5
$ td -> substr ( 1 , 3 ); // null
$ td instanceof Str; // true
$ td -> shouldHaveReceived ( ' substr ' )-> with ( 1 , 3 );
Terakhir, double()
menerima argumen passthru kedua. Secara default, passthru adalah false
. Jika disetel ke true
, objek pengujian akan meneruskan pemanggilan metode apa pun ke objek yang mendasarinya.
Di Mockery, ini setara dengan Mockery::mock(Number::class)->shouldDeferMissing()
.
<?php
class Number
{
public function one ()
{
return 1 ;
}
public function random ()
{
return 5 ;
}
}
$ td = double (Number::class, true );
$ td -> shouldReceive ( ' random ' )-> andReturn ( 21 );
$ td -> random (); // 21
$ td -> one (); // 1
$ td instanceof Number; // true
$ td -> shouldHaveReceived ( ' one ' );
Catatan: passthru hanya dapat digunakan saat membuat pengujian ganda dengan referensi kelas karena hanya saat itulah implementasi yang mendasarinya ada.
Pada akhirnya, double()
adalah cara berpendirian untuk membuat objek pengujian untuk kode dasar Anda. Jika tidak memenuhi kebutuhan Anda, Anda selalu dapat membuat Mockery::mock()
secara langsung. Namun, melakukan hal tersebut kemungkinan besar berarti Anda sedang menguji penerapan Anda dengan cara yang tidak mencerminkan perilaku dunia nyata. Ingat, double()
mengembalikan objek yang mengimplementasikan MockeryInterface
. Sehingga dapat diperlakukan seperti objek Mockery::mock()
lainnya.