내부
composer require --dev proklung/phpunit-testing-tools
클래스 내용:
ProklTestingToolsBaseBaseTestCase 사용; ProklTestingToolsToolsContainerBuildContainer 사용; 클래스 ContainerAwareBaseTestCase는 BaseTestCase를 확장합니다. {/** * @inheritDoc * @throws 예외 */protected 함수 setUp(): void{$this->container = static::$testContainer = BuildContainer::getTestContainer( ['dev/test_container.yaml','dev/local.yaml'],'/Resources/config', [new SampleCompilerPass()], // Опциональный параметр - кастомные 컴파일러 패스,'dev', // Окружение. По умолчаник - devtrue // 디버그. По умолчаниosity - true,['service_to_mock'] // Сервисы, подлежаЂе мокингу (см. подраздел Моки сервисов));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'] // Сервис, который будет заменен моком.); }공개 함수 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 모의 또는 원하는 다른 모의를 생성합니다.ServiceMocker::swap($this->container->get('filesystem.local.adapter'), $mock);// .. . $service = $this->container->get('filesystem.local.adapter'); $result = $service->getAdapter(); // 메타 세르비사(или сервис целиком) подменен. }protected function teaDown(): void{// 다른 testServiceMock::resetAll()에 영향을 미치지 않도록 하기 위해;// 서비스를 자동으로 재설정하기 위해 RestoreServiceContainer 특성을 포함할 수 있습니다.} }
ProklTestingToolsTraitsBootTestKernelTrait 사용;클래스 예제테스트는 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') ->full('in_the_loop', 참) ->모의();
Namespace
- пространство имен, в котором мокается функция.
Или частичное моканье (в зависимости от argumententoв):
// При вызове get_cat_name с аргументом $this->idCategory вернет 모의 카테고리 $this->mockerFunctions->setNamespace('TestAPIEntity') ->partial('get_cat_name', '모의 카테고리', $this->idCategory) ->partial('category_description', '모의 카테고리 설명', $this->idCategory) ->모의();
При использовании этой фичи рекомендуется (во избежании проблем)에 대한 테스트 정보:
/** * 데이터() * * @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,new 정의(IntegrityCheck::class, []) )->setTags(['console.command' => ['command' => 'module:еуые']])->setPublic(true);self::$kernel = $this->bootTestKernel($container); $this->cliApplication = 신규 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) // 명령 클래스 또는 "name"->splitOutputStreams()를 사용할 수 있습니다. // 기본적으로 stdout/stderr은 결합되며, 이 옵션은 이들을 분할합니다->addArgument( 'KB본드') ->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('this is in 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(); $결과->errorOutput(); } }
일:
AppCommandCreateUserCommand 사용; PHPUnitFrameworkTestCase 사용; ProklTestingToolsToolsConsoleTestCommand 사용; 클래스 CreateUserCommandTest는 TestCase를 확장합니다. {공개 함수 test_can_create_user(): 무효{ TestCommand::for(new CreateUserCommand(/** 인수... */)) ->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('this is in stderr') // ->splitOutputStreams()->assertErrorOutputNotContains('admin user')와 함께 사용됨 // ->splitOutputStreams()->dump()와 함께 사용 // 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(); $결과->errorOutput(); } }
클래스 마이클래스 {개인 문자열 $privateProperty = '개인 값';개인 함수 privateMethod(): 문자열{return '개인 반환 값'; } }$myClass = 새로운 Myclass();
invade
함수를 이용하여 사유재산의 값을 알아내는 방법입니다.
침입($myClass)->privateProperty; // '비공개 값'을 반환합니다.
invade
기능을 사용하면 개인 값을 변경할 수도 있습니다.
Invade($myClass)->privateProperty = '변경된 값';invade($myClass)->privateProperty; // '변경된 값을 반환합니다.
invade
사용하면 개인 함수를 호출할 수도 있습니다.
침입($myClass)->privateMethod(); // '개인 반환 값'을 반환합니다.