เบื่อกับการจำความแตกต่างระหว่างการเยาะเย้ย บางส่วน และสายลับในการเยาะเย้ยหรือไม่? ฉันเอง ซึ่งเป็นเหตุผลว่าทำไมฉันถึงสร้าง double()
- วิธีการช่วยเหลือง่ายๆ เพื่อให้การใช้ Mockery ง่ายขึ้น
เมื่อเขียนแบบทดสอบ ฉันไม่ต้องการคิดถึงความแตกต่างระหว่าง ของปลอม การเยาะเย้ย และ สายลับ ฉันเพียงเพื่อสร้าง การทดสอบทั่วไปสองเท่า และมุ่งเน้นไปที่การเขียนการทดสอบของฉัน ลักษณะทั่วไปนี้เป็นเรื่องปกติในเฟรมเวิร์กการทดสอบอื่นๆ เช่น RSpec, td.js และอื่นๆ
หากต้องการติดตั้งตัวช่วย double()
เวอร์ชันล่าสุด ให้รันคำสั่ง:
composer require --dev jasonmccreary/test-double
เมื่อใดก็ตามที่คุณต้องการสร้าง การทดสอบ double เพียงเรียก double()
ตามค่าเริ่มต้น double()
จะส่งคืนออบเจ็กต์ที่จะช่วยให้คุณสามารถ stub วิธีการและตรวจสอบการเรียกใช้เมธอดได้
<?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 สามารถใช้ได้เฉพาะเมื่อสร้าง test double พร้อมการอ้างอิงคลาสเท่านั้น เนื่องจากเป็นครั้งเดียวที่มีการใช้งานพื้นฐานอยู่
ในท้ายที่สุด double()
เป็นวิธีที่ให้ความคิดเห็นในการสร้างอ็อบเจ็กต์ทดสอบสำหรับโค้ดพื้นฐานของคุณ หากไม่ตรงตามความต้องการของคุณ คุณสามารถสร้าง Mockery::mock()
ได้โดยตรงเสมอ อย่างไรก็ตาม การทำเช่นนั้นอาจเป็นกลิ่นที่คุณกำลังทดสอบการใช้งานในลักษณะที่ไม่สะท้อนถึงพฤติกรรมในโลกแห่งความเป็นจริง โปรดจำไว้ว่า double()
ส่งคืนวัตถุที่ใช้ MockeryInterface
ดังนั้นจึงสามารถถือเป็นวัตถุ Mockery::mock()
อื่น ๆ ได้