內部的
composer require --dev proklung/phpunit-testing-tools
Создать класс:
使用 ProklTestingToolsBaseBaseTestCase;使用 ProklTestingToolsToolsContainerBuildContainer;類別 ContainerAwareBaseTestCase 擴充 BaseTestCase {/** * @inheritDoc * @throws Exception */受保護的函式 setUp(): void{$this->container = static::$testContainer = BuildContainer::getTestContainer( ['dev/test_container.yaml','dev/local.yaml'],'/Resources/config', [new SampleCompilerPass()], // Опциональный параметр - кастомные 編譯器通行證,'dev', // Окружение. По умолчанию - devtrue // 除錯。 По умолчанию - true,['service_to_mock'] // Сервисы, подлежащие мокингу (см. одраздел мокингу (см. } }
Отнаследовать от него тест。
Подгрузятся конфиги сервисов из указанных файлов по указанному уайлов по указанном
Механизм(на базе создания прокси-сервисов по заданному списку)взят до анному списку)взя ды。
使用 ProklTestingToolsToolsServiceMocker;使用 ProklTestingToolsBaseBaseTestCase;類別 MyTest 擴充 BaseTestCase {使用 RestoreServiceContainer;受保護的函式 setUp(): void{parent::setUp(); $this->container = BuildContainer::getTestContainer( ['test_container.yaml'],'/../../../../tests/Standalone/Resource/config', [],'dev',true, ['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', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . '/test/'); }); // 這會將一個新的可呼叫ServiceMock::next($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { throw new InvalidArgument('getAdapter 可以呼叫一次! });$mock = // 建立一個PHPUnit 模擬或任何其他你想要的模擬。 .. 。 $service = $this->container->get('filesystem.local.adapter'); $結果 = $service->getAdapter(); // Метод сервиса (или сервис целиком) подменен. }protected function teaDown(): void{// 確保我們不會影響其他測試ServiceMock::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
- 日期時間
provideNotExistingFilePath
- путь к несуществующему файлу
Обертка над。
範例(來自BaseTestCase
的 унаследованном от):
// Замокается полностью (т.е. не важно с какими параметрами пройдет вызон фц ->full('in_the_loop', true) -> 模擬();
Namespace
- пространство имен, в котором мокается функция。
Или частичное моканье (в зависимости от аргументов):
// 取得 get_cat_name с аргументом $this->idCategory вернет 類比類別 $this->mockerFunctions->setNamespace('TestAPIEntity') ->partial('get_cat_name', '模擬類別', $this->idCategory) ->partial('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;類別 CreateBaseCommandTest 擴充 UserTestCaseTestKernelTrait;類別 CreateBaseCommandTest 擴充 UserTestCase {使用 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('Creating admin user "kbond"') ->assertOutputContains('角色:ROLE_EMPLOYEE, ROLE_MANAGER') ->assertOutputNotContains('普通用戶') ;// 進階用法$this->consoleCommand(CreateUserCommand::class) // 可以使用指令類別或「name」->splitOutputStreams() // 預設情況下stdout/stderr是組合的,這個選項將它們分開-> addArgument( 'kbond') ->addOption('--admin') // 帶或不帶“--”前綴->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // 捷徑選項需要「-」前綴->addOption('-vv') // 預設情況下,輸出具有正常的詳細程度,使用標準選項變更(-q, - v , -vv, -vvv)->addOption('--ansi') // 預設情況下,輸出是未修飾的,使用此選項進行修飾->execute() // 執行指令->assertSuccessful() ->assertStatusCode(0) // 相當於 ->assertSuccessful()->assertOutputContains('Creating admin user "kbond"') ->assertErrorOutputContains('this is in stderr') // 與 ->splitOutputStreams()->assertErrorOutputNotContains('admin user') 結合使用 ->splitOutputStreams()->dump() // 轉儲() 狀態碼結合使用 ->splitOutputStreams()->dump() // 轉儲() 狀態碼/輸出和continue->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(); $結果->錯誤輸出(); } }
Или:
使用 AppCommandCreateUserCommand;使用 PHPUnitFrameworkTestCase;使用 ProklTestingToolsToolsConsoleTestCommand;類別 CreateUserCommandTest 擴充 TestCase {公用函數 test_can_create_user(): void{ 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('Creating admin user "kbond"') ->assertErrorOutputContains('this is in stderr') // 與 ->splitOutputStreams()->assertErrorOutputNotContains('admin user') 結合使用 ->splitOutputStreams()->dump() // 轉儲() 狀態碼結合使用 ->splitOutputStreams()->dump() // 轉儲() 狀態碼/輸出和continue->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(); $結果->錯誤輸出(); } }
我的班級 {private string $privateProperty = '私有值';私有函數 privateMethod(): string{return '私有回傳值'; } }$myClass = new Myclass();
這就是如何使用invade
函數來獲取私有財產的值。
侵入($myClass)->privateProperty; // 傳回“私有值”
invade
功能還允許您更改私有值。
入侵($myClass)->privateProperty = '更改值';入侵($myClass)->privateProperty; // 傳回“改變後的值”
使用invade
你也可以呼叫私有函數。
侵入($myClass)->privateMethod(); // 傳回“私有回傳值”