الحقن التلقائي للنماذج في موضوعات الاختبار عبر التعليقات التوضيحية #InjectMocks و#Mock، لتسريع اختبار الوحدة باستخدام PHPUnit.
احصل على نسخة باللغة البرتغالية هنا.
للتثبيت في بيئة التطوير:
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 على الخصائص المقابلة للتبعيات التي تريد الاستهزاء بها أو حقن.
بعد ذلك، قم بتشغيل خدمة الحاقن باستخدام الجملة MockInjector::inject($this)
. يمكن الإعلان عن هذا التنفيذ في كل اختبار أو في setUp
.
بعد تنفيذ الحاقن، ستكون service
المشروحة بـ #InjectMocks مثيلًا حقيقيًا متاحًا في نطاق فئة الاختبار، وكل تبعية مشروحة بـ #Mock ستكون مثيلًا لـ MockObject، ويتم حقنها في موضوع الاختبار عبر المنشئ، وسوف تكون متاحة أيضًا في نطاق فئة الاختبار.
MockInjectException
.تعمل #InjectMocks و #Mock بشكل مستقل أو منفردًا أو معًا. تفاصيل عن كل واحد:
سيتم إنشاء مثيل حقيقي من خلال المنشئ، وإذا كانت هناك معلمات في المنشئ، فسيتم استخدام القيمة التالية في كل معلمة، بهذا الترتيب:
mock
تم إنشاؤه باستخدام السمة #[Mock]، إن وجدت؛default
إذا كانت معلمة اختيارية؛null
إذا تم كتابته كـ null
؛mock
إذا لم يكن من النوع البدائي. في هذه الحالة، لن يتم إدخال هذا mock
في نطاق TestCase؛MockInjectException
.Obs.: يمكنك استخدام سمة #Mock على جميع، أو بعض، أو لا شيء من تبعيات موضوع الاختبار.
سيتم إنشاء نموذج mock
تم إدخاله في نطاق TestCase، دون استخدام المُنشئ. سلوك الإنشاء هذا مطابق لـ TestCase::createMock()
.