การแทรกการเยาะเย้ยลงในวิชาทดสอบโดยอัตโนมัติผ่านคำอธิบายประกอบ #InjectMocks และ #Mock เพื่อเร่งการทดสอบหน่วยด้วย PHPUnit
Leia a versão em português aqui.
หากต้องการติดตั้งในสภาพแวดล้อมการพัฒนา:
composer require --dev silasyudi/inject-mocks
การใช้คำอธิบายประกอบ #InjectMocks และ #Mock ในชั้นเรียนทดสอบ จะทำให้คุณสามารถแทรกการเยาะเย้ยลงในวิชาทดสอบได้โดยอัตโนมัติ
ในสถานการณ์ทั่วไป เราจะทำเช่นนี้:
class SomeTest extends PHPUnit Framework TestCase
{
public void testSomething()
{
$ someDependency = $ this -> createMock (Dependency::class);
$ anotherDependency = $ this -> createMock (AnotherDependency::class);
. . .
$ subject = new Service ( $ someDependency , $ anotherDependency , ...);
. . .
}
...
วิธีการนี้นำมาซึ่งความยากลำบากในการบำรุงรักษา เพราะหากหัวข้อการทดสอบมีการเปลี่ยนแปลง ไม่ว่าจะโดยการเพิ่ม ลด หรือแทนที่การขึ้นต่อกัน คุณจะต้องเปลี่ยนในการทดสอบแต่ละครั้ง
ด้วยคำอธิบายประกอบ #InjectMocks/#Mock เราจะสรุปการเปลี่ยนแปลงหัวข้อทดสอบเหล่านี้ ตัวอย่าง:
use SilasYudi InjectMocks InjectMocks ;
use SilasYudi InjectMocks Mock ;
use SilasYudi InjectMocks MockInjector ;
class SomeTest extends PHPUnit Framework TestCase
{
#[Mock]
private Dependency $ someDependency ;
#[Mock]
private AnotherDependency $ anotherDependency ;
. . .
# [InjectMocks]
public function setUp() : void
{
MockInjector:: inject ( $ this );
}
public void testSomething ()
{
// $this->subject e as dependências já estão instanciadas.
}
...
ดังตัวอย่างในหัวข้อที่แล้ว ต้องวางแอตทริบิวต์ #InjectMocks บนคุณสมบัติของหัวข้อทดสอบที่คุณต้องการทดสอบ และต้องวางแอตทริบิวต์ #Mock บนคุณสมบัติที่สอดคล้องกับการขึ้นต่อกันที่คุณต้องการจำลองหรือ ฉีด.
หลังจากนั้น ให้รัน injector service ด้วยประโยค MockInjector::inject($this)
การดำเนินการนี้สามารถประกาศได้ในการทดสอบแต่ละครั้งหรือใน setUp
หลังจากดำเนินการหัวฉีดแล้ว service
ที่มีคำอธิบายประกอบด้วย #InjectMocks จะเป็นอินสแตนซ์จริงที่มีอยู่ในขอบเขตของคลาสการทดสอบ และการขึ้นต่อกันแต่ละรายการที่มีคำอธิบายประกอบด้วย #Mock จะเป็นอินสแตนซ์ของ MockObject ที่ถูกฉีดเข้าไปในหัวข้อทดสอบผ่านทางตัวสร้าง และจะ มีอยู่ในขอบเขตของคลาสทดสอบด้วย
MockInjectException
#InjectMocks และ #Mock ทำงานอย่างอิสระและโดดเดี่ยวหรือทำงานร่วมกัน รายละเอียดเกี่ยวกับแต่ละรายการ:
มันจะสร้างอินสแตนซ์จริงผ่านตัวสร้าง และหากมีพารามิเตอร์ในตัวสร้าง ค่าต่อไปนี้จะถูกใช้ในแต่ละพารามิเตอร์ ตามลำดับนี้:
mock
ที่สร้างขึ้นจากแอตทริบิวต์ #[Mock] หากมีอยู่default
หากเป็นพารามิเตอร์ทางเลือกnull
หากพิมพ์เป็น null
;mock
หากไม่ใช่ประเภทดั้งเดิม ในกรณีนี้ mock
นี้จะไม่ถูกฉีดเข้าไปในขอบเขต TestCaseMockInjectException
Obs.: คุณสามารถใช้แอตทริบิวต์ #Mock กับการอ้างอิงของหัวข้อทดสอบทั้งหมด บางส่วนหรือไม่มีเลยก็ได้
จะสร้าง mock
ที่ฉีดเข้าไปในขอบเขต TestCase โดยไม่ต้องใช้ตัวสร้าง ลักษณะการสร้างนี้เหมือนกับ TestCase::createMock()