داخلي
composer require --dev proklung/phpunit-testing-tools
إنشاء الفصل:
استخدام ProklTestingToolsBaseBaseTestCase;استخدام ProklTestingToolsToolsContainerBuildContainer;الفئة ContainerAwareBaseTestCase تمتد BaseTestCase {/** * @inheritDoc * @throws Exception */protected function setUp(): void{$this->container = static::$testContainer = BuildContainer::getTestContainer( ['dev/test_container.yaml','dev/local.yaml'],'/Resources/config', [new SampleCompilerPass()], // المعلمة الاختيارية - تمرير المترجم الصنفي، 'dev'، // إغلاق. По умолчанию - devtrue // Debug. По умолчанию - true,['service_to_mock'] // خدمات دعم الماكينات (см. подраздел Моки servисов));parent::setUp(); } }
الخروج من هذا الاختبار.
قم بدعم خدمات التكوين من الملفات المحذوفة عبر المسارات المضمنة (اختبار DOCUMENT_ROOT الخاص).
الآلية (الأساسية لإنشاء خدمة الوكيل في قائمة الانتظار) تستخدم شريطًا ومكيفًا وفقًا للاحتياجات المحلية.
استخدام ProklTestingToolsToolsServiceMocker;استخدام ProklTestingToolsBaseBaseTestCase;فئة MyTest تمتد BaseTestCase {استخدام RestoreServiceContainer؛ وظيفة setUp المحمية (): void{parent::setUp(); $this->container = BuildContainer::getTestContainer( ['test_container.yaml'],'/../../../../tests/Standalone/Resource/config', []،'ديف'، صحيح، ['filesystem.local.adapter'] // الخدمة التي سيتم تخزينها مؤقتًا.); }اختبار الوظيفة العامة () {// لجميع الاستدعاءات ServiceMock::all($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . ' /امتحان/')؛ }); $result = $this->container->get('filesystem.local.adapter');// للمكالمة التالية فقط ServiceMock::next($this->container->get('filesystem.local.adapter') , 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . '/test/'); }); // سيضع هذا في قائمة الانتظار ServiceMock::next($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { throw new InvalidArgument('getAdapter يمكن الاتصال به مرة واحدة! '); });$mock = // أنشئ نسخة وهمية لـ PHPUnit أو أي نسخة وهمية أخرى تريدها.ServiceMocker::swap($this->container->get('filesystem.local.adapter'), $mock);// .. . $service = $this->container->get('filesystem.local.adapter'); $result = $service->getAdapter(); // طريقة الخدمة (أو خدمة العملاء) ملحقة. }protected function TeaDown(): void{// للتأكد من أننا لا نؤثر على الاختبارات الأخرىServiceMock::resetAll();// يمكنك تضمين سمة RestoreServiceContainer لإعادة تعيين الخدمات تلقائيًا} }
استخدم ProklTestingToolsTraitsBootTestKernelTrait؛ فئة ExampleTest تمتد ProklTestingToolsBaseBaseTestCase {استخدام BootTestKernelTrait؛وظيفة محمية setUp(): void{parent::setUp();$container = new ContainerBuilder(); // ... إرسال اختبار contейнера.self::$kernel = $this->bootTestKernel($container); } }
فئة أساسية لقيادة الاختبار.
الطرق:
executeCommand(Command $commandInstance, string $commandName, array $params = [])
- يشير إلى أن الأمر يظهر على الشاشة.
runCommand(Command $command, $input = [])
- تظهر النتيجة استخدام طريقة execute
الأوامر.
عدد قليل من مقدمي البيانات
provideEmptyValue
- البداية المستمرة.
provideEmptyScalarValue
- المزيد من الدرجات
provideBooleanValue
- bulевы значения
provideDateTimeInstance
- المثيل DateTime
provideNotExistingFilePath
- أدخل إلى الملف غير الضروري
اوبرتكا على التوالي.
مثال (في الاختبار، يختلف عن BaseTestCase
):
// التسجيل الكامل (هذا ليس مهمًا مع بعض معلمات إنتاج الصوت) وظيفة in_the_loop $this->mockerFunctions->setNamespace('TestsAPI') ->كامل('in_the_loop'، صحيح) ->موك();
Namespace
- عنصر بسيط، حيث يتم استخدام الوظيفة.
أو مكان خاص (في ضوء الحجج):
// قبل استخدام get_cat_name باستخدام الوسيطة $this->idCategory، يتم التحقق من الفئة المستهزئة $this->mockerFunctions->setNamespace('TestAPIEntity') ->جزئي('get_cat_name', 'فئة مستهزئة', $this->idCategory) ->جزئي('category_description', 'وصف الفئة التي تم الاستهزاء بها', $this->idCategory) ->موك();
عند استخدام هذه الورقة يوصى (لإزالة المشكلة) بالاختبار، قم بوضع التعليقات التوضيحية:
/** * data() * * @runInSeparateProcess * @preserveGlobalState معطل */
منشئ محددات الخدمة Symfony للاختبار.
الطريقة:
constructServiceLocator(array $config)
- نظرة عامة على $config
:
$object = new ClassName();$config = [ 'service_key' => ClassName::class, 'service_key2' => $object, ];
إذا سبقت تسمية الفصل في التكوين، فسيتم تثبيت طريقة إدخال الفصل.
حزمة شوكة
استخدام AppCommandCreateUserCommand;استخدام ProklTestingToolsBaseBaseTestCase;استخدام ProklTestingToolsToolsConsoleInteractsWithConsole;استخدام ProklTestingToolsTraitsBootTestKernelTrait;الفئة CreateUserCommandTest تمتد BaseTestCase {استخدام InteractsWithConsole؛استخدام BootTestKernelTrait؛ وظيفة محمية setUp(): void{parent::setUp();$container = new ContainerBuilder();$container->setDefinition( IntegrityCheck::class، تعريف جديد (IntegrityCheck::class، []) )->setTags(['console.command' => ['command' => 'module:еуые']])->setPublic(true);self::$kernel = $this->bootTestKernel($container); $this->cliApplication = new SymfonyBundleFrameworkBundleConsoleApplication(self::$kernel);$this->cliApplication->add($container->get(IntegrityCheck::class)); } الوظيفة العامة test_can_create_user(): void{$this->executeConsoleCommand('create:user kbond --admin --role=ROLE_EMPLOYEE --role=ROLE_MANAGER') ->assertSuccessful() // رمز خروج الأمر هو 0->assertOutputContains('إنشاء مستخدم إداري "kbond"') ->assertOutputContains('بالأدوار: ROLE_EMPLOYEE، ROLE_MANAGER') ->assertOutputNotContains('المستخدم العادي') ;// الاستخدام المتقدم$this->consoleCommand(CreateUserCommand::class) // يمكن استخدام فئة الأمر أو "الاسم"->splitOutputStreams() // بشكل افتراضي يتم دمج stdout/stderr، وهذا الخيار يقسمهما->addArgument( "كبوند") ->addOption('--admin') // مع أو بدون البادئة "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // تتطلب خيارات الاختصار البادئة "-"->addOption('-vv') // بشكل افتراضي، يكون الإخراج إسهابًا عاديًا، استخدم الخيارات القياسية للتغيير (-q, -v , -vv, -vvv)->addOption('--ansi') // بشكل افتراضي، الإخراج غير مزخرف، استخدم هذا الخيار لتزيين->execute() // قم بتشغيل الأمر->assertSuccessful() ->assertStatusCode(0) // يعادل ->assertSuccessful()->assertOutputContains('إنشاء مستخدم إداري "kbond"') ->assertErrorOutputContains('هذا موجود في stderr') // يُستخدم بالتزامن مع ->splitOutputStreams()->assertErrorOutputNotContains('admin user') // يُستخدم بالتزامن مع ->splitOutputStreams()->dump() // dump () رمز الحالة/المخرجات والمتابعة->dd() // dd() رمز الحالة/المخرجات؛// الاختبار التفاعلي الأوامر$this->executeConsoleCommand('create:user', ['kbond']) ->تأكيد ناجح() ->assertOutputContains('إنشاء مستخدم عادي "kbond"') ; // الأوامر التفاعلية للاختبار المتقدم$this->consoleCommand(CreateUserCommand::class) ->addInput('kbond') ->addOption('--no-interaction') // يتم تشغيل الأوامر بشكل تفاعلي إذا تم توفير الإدخال، استخدم هذا الخيار لتعطيل->execute() ->تأكيد ناجح() ->assertOutputContains('إنشاء مستخدم عادي "kbond"') ; // نتيجة الوصول$result = $this->executeConsoleCommand('create:user');$result->statusCode();$result->output(); $result->errorOutput(); } }
أو:
استخدام AppCommandCreateUserCommand;استخدام PHPUnitFrameworkTestCase;استخدام ProklTestingToolsToolsConsoleTestCommand;فئة CreateUserCommandTest تمتد TestCase {اختبار الوظيفة العامة_can_create_user(): باطلة{ TestCommand::for(new CreateUserCommand(/** args... */)) ->splitOutputStreams() // بشكل افتراضي يتم دمج stdout/stderr، وهذا الخيار يقسمهما->addArgument('kbond') ->addOption('--admin') // مع أو بدون البادئة "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // تتطلب خيارات الاختصار البادئة "-"->addOption('-vv') // بشكل افتراضي، يكون الإخراج إسهابًا عاديًا، استخدم الخيارات القياسية للتغيير (-q, -v , -vv, -vvv)->addOption('--ansi') // بشكل افتراضي، الإخراج غير مزخرف، استخدم هذا الخيار لتزيين->execute() ->تأكيد ناجح() ->assertStatusCode(0) // يعادل ->assertSuccessful()->assertOutputContains('إنشاء مستخدم إداري "kbond"') ->assertErrorOutputContains('هذا موجود في stderr') // يُستخدم بالتزامن مع ->splitOutputStreams()->assertErrorOutputNotContains('admin user') // يُستخدم بالتزامن مع ->splitOutputStreams()->dump() // dump () رمز الحالة/المخرجات والمتابعة->dd() // dd() رمز الحالة/المخرجات؛ // اختبار الأوامر التفاعليةTestCommand::for(new CreateUserCommand(/** args... */)) ->addInput('kbond') ->addOption('--no-interaction') // يتم تشغيل الأوامر بشكل تفاعلي إذا تم توفير الإدخال، استخدم هذا الخيار لتعطيل->execute() ->تأكيد ناجح() ->assertOutputContains('إنشاء مستخدم عادي "kbond"') ;// الوصول إلى النتيجة$result = TestCommand::for(new CreateUserCommand(/** args... */))->execute();$result->statusCode();$result->output(); $result->errorOutput(); } }
فئة ماي كلاس {سلسلة خاصة $privateProperty = 'قيمة خاصة'؛ وظيفة خاصة PrivateMethod (): سلسلة {return 'قيمة الإرجاع الخاصة'؛ } }$myClass = new Myclass();
هذه هي الطريقة التي يمكنك بها الحصول على قيمة الملكية الخاصة باستخدام وظيفة invade
.
غزو($myClass)->privateProperty; // يُرجع "قيمة خاصة"
تتيح لك وظيفة invade
أيضًا تغيير القيم الخاصة.
Invade($myClass)->privateProperty = 'القيمة المتغيرة';invade($myClass)->privateProperty; // يُرجع "القيمة المتغيرة".
باستخدام invade
يمكنك أيضًا استدعاء الوظائف الخاصة.
غزو($myClass)->privateMethod(); // تُرجع "قيمة الإرجاع الخاصة"