ภายใน
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'],'/ทรัพยากร/config', [new SampleCompilerPass()], // Опциональный параметр - кастомные คอมไพเลอร์ผ่าน, 'dev', // Окружение. POо умолчанию - devtrue // Debug. PO умолчанию - true,['service_to_mock'] // Сервисы, подлежащие мокингу (см. подраздел Моки сервисов));parent::setUp(); - -
Отнаследовать от него тест.
Подгрузятся конфиги сервисов из указанных файлов по указанному пути (относительно DOCUMENT_ROOT тестов).
Механизм (на базе создания прокси-сервисов по заданному списку) взят из бандла и адаптирован под локальные нужды.
ใช้ ProklTestingToolsToolsServiceMocker; ใช้ ProklTestingToolsBaseBaseTestCase; คลาส MyTest ขยาย BaseTestCase {ใช้ RestoreServiceContainer; ฟังก์ชั่นที่ได้รับการป้องกัน setUp(): เป็นโมฆะ {parent::setUp(); $this->container = BuildContainer::getTestContainer( ['test_container.yaml'],'/../../../../tests/Standalone/Resource/config', [],'dev',จริง, ['filesystem.local.adapter'] // Сервис, который будет заменен моком.); } ฟังก์ชั่นสาธารณะ testFoo() {// สำหรับการโทรทั้งหมด 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', ฟังก์ชั่น () { คืนท้องถิ่นใหม่( $_SERVER['DOCUMENT_ROOT'] . '/test/'); - // สิ่งนี้จะจัดคิว ServiceMock::next($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { Throw new InvalidArgument('getAdapter can call when time! '); });$mock = // สร้าง PHPUnit จำลองหรือจำลองอื่น ๆ ที่คุณต้องการServiceMocker::swap($this->container->get('filesystem.local.adapter'), $mock);// .. . $service = $this->container->get('filesystem.local.adapter'); $result = $service->getAdapter(); // Метод сервиса (или сервис целиком) подменен. }ฟังก์ชันที่ได้รับการป้องกัน TearDown(): void{// เพื่อให้แน่ใจว่าเราจะไม่ส่งผลกระทบต่อ testServiceMock::resetAll();// คุณสามารถรวมลักษณะ RestoreServiceContainer เพื่อรีเซ็ตบริการโดยอัตโนมัติได้} -
ใช้ ProklTestingToolsTraitsBootTestKernelTrait; class ExampleTest ขยาย ProklTestingToolsBaseBaseTestCase {ใช้ BootTestKernelTrait; ฟังก์ชั่นที่ได้รับการป้องกัน setUp(): void{parent::setUp();$container = new ContainerBuilder(); // ... Наполнение тестового контейнера.self::$kernel = $this->bootTestKernel($container); - -
Базовый класс для тестирования консольных команд.
วิธีการ:
executeCommand(Command $commandInstance, string $commandName, array $params = [])
- вернет то, что команда вывела на экран.
runCommand(Command $command, $input = [])
- вернет результат выполнения метода execute
команды.
Несколько общих дата-провайдеров
provideEmptyValue
- คำสั่ง значения.
provideEmptyScalarValue
- การกำหนดค่าเริ่มต้น
provideBooleanValue
- булевы значения
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 = ใหม่ SymfonyBundleFrameworkBundleConsoleApplication(ตนเอง::$kernel);$this->cliApplication->เพิ่ม($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) // สามารถใช้คลาสคำสั่งหรือ "name"->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('สร้าง:ผู้ใช้', ['kbond']) ->ยืนยันสำเร็จ() -> assertOutputContains ('กำลังสร้างผู้ใช้ทั่วไป "kbond") - // การทดสอบคำสั่งเชิงโต้ตอบขั้นสูง $this->consoleCommand(CreateUserCommand::class) ->addInput('kbond') ->addOption('--no-interaction') // คำสั่งจะถูกรันแบบโต้ตอบหากมีอินพุต ให้ใช้ตัวเลือกนี้เพื่อปิดการใช้งาน->execute() ->ยืนยันสำเร็จ() -> assertOutputContains ('กำลังสร้างผู้ใช้ทั่วไป "kbond") - // เข้าถึง result$result = $this->executeConsoleCommand('create:user');$result->statusCode();$result->output(); $ผล->errorOutput(); - -
อิลลี:
ใช้ AppCommandCreateUserCommand; ใช้ PHPUnitFrameworkTestCase; ใช้ ProklTestingToolsToolsConsoleTestCommand; คลาส CreateUserCommandTest ขยาย TestCase {ฟังก์ชันสาธารณะ test_can_create_user(): เป็นโมฆะ{ TestCommand::for(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") ;// access result$result = TestCommand::for(new CreateUserCommand(/** args... */))->execute();$result->statusCode();$result->output(); $ผล->errorOutput(); - -
คลาส MyClass {private string $privateProperty = 'private value';ฟังก์ชันส่วนตัว privateMethod(): string{return 'private return value'; - }$myClass = มายคลาสใหม่();
นี่คือวิธีที่คุณจะได้รับมูลค่าของทรัพย์สินส่วนตัวโดยใช้ฟังก์ชัน invade
บุก($myClass)->privateProperty; // ส่งกลับ 'มูลค่าส่วนตัว'
ฟังก์ชั่น invade
ยังช่วยให้คุณเปลี่ยนค่าส่วนตัวได้
บุกรุก($myClass)->privateProperty = 'ค่าที่เปลี่ยนแปลง'; บุกรุก($myClass)->privateProperty; // ส่งคืน 'ค่าที่เปลี่ยนแปลง'
การใช้ invade
คุณยังสามารถเรียกใช้ฟังก์ชันส่วนตัวได้
บุก($myClass)->privateMethod(); // ส่งกลับ 'ค่าส่งคืนส่วนตัว'