厭倦了記住 Mockery 中模擬、部分和間諜之間的區別?我就是這樣,這就是為什麼我創建了double()
- 一個簡單的輔助方法,可以讓 Mockery 的使用變得更容易。
在編寫測試時,我不想考慮fakes 、 mocks和spies之間的差異。我只是為了創建一個通用測試替身並專注於編寫我的測試。這種概括在其他測試框架(例如 RSpec、td.js 等)中很常見。
若要安裝最新版本的double()
幫助程序,請執行下列命令:
composer require --dev jasonmccreary/test-double
任何時候你需要建立一個測試替身,只需呼叫double()
預設情況下, double()
傳回一個對象,該對象允許您存根方法以及驗證方法呼叫。
<?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 ' );
在 Mockery 中,此測試替身相當於Mockery::mock()->shouldIgnoreMissing()
,或在最近的版本中Mockery::spy()
。
您也可以向double()
傳遞對類別或介面的參考。這將建立一個擴展類別或實作介面的測試物件。這允許 double 在您的實作中傳遞任何類型提示或類型檢查。
<?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 );
最後, double()
接受passthru的第二個參數。預設情況下, passthru為false
。當設定為true
時,測試物件會將任何方法呼叫傳遞給底層物件。
在 Mockery 中,這相當於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 ' );
注意: passthru只能在使用類別引用建立測試替身時使用,因為這是唯一存在底層實作的情況。
最後, double()
是為底層程式碼建立測試物件的一種固執己見的方法。如果它不能滿足您的需求,您可以直接建立一個Mockery::mock()
。然而,這樣做可能會讓您以一種不反映現實世界行為的方式測試您的實現。請記住, double()
傳回一個實作MockeryInterface
的物件。因此它可以被視為任何其他Mockery::mock()
物件。