INTERNO
composer require --dev proklung/phpunit-testing-tools
Classe de classificação:
usar ProklTestingToolsBaseBaseTestCase; usar ProklTestingToolsToolsContainerBuildContainer;class ContainerAwareBaseTestCase estende BaseTestCase {/** * @inheritDoc * @throws Exceção */protected function setUp(): void{$this->container = static::$testContainer = BuildContainer::getTestContainer( ['dev/test_container.yaml','dev/local.yaml'],'/Resources/config', [new SampleCompilerPass()], // Parâmetro opcional - кастомные compiler passes,'dev', // Окружение. Por exemplo - devtrue // Debug. Por exemplo - true,['service_to_mock'] // Serviços, você pode configurar (como um serviço de serviço));parent::setUp(); } }
Отнаследовать от него тест.
Подгрузятся конфиги сервисов из указанных файлов указанному пути (относительно DOCUMENT_ROOT testes).
Mecanismo (na maior parte do programa de proxy para segurança de dados) é usado em bandas e adaptadores locais não.
usar ProklTestingToolsToolsServiceMocker; usar ProklTestingToolsBaseBaseTestCase; classe MyTest estende BaseTestCase {use RestoreServiceContainer;função protegida setUp(): void{parent::setUp(); $this->container = BuildContainer::getTestContainer( ['test_container.yaml'],'/../../../../tests/Standalone/Resource/config', [],'dev',verdadeiro, ['filesystem.local.adapter'] // Сервис, который будет заменен моком.); }função pública testFoo() {// Para todas as chamadas ServiceMock::all($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . ' /teste/'); }); $result = $this->container->get('filesystem.local.adapter');// Somente para a próxima chamada ServiceMock::next($this->container->get('filesystem.local.adapter') , 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . '/test/'); }); // Isso irá enfileirar um novo ServiceMock::next($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { throw new InvalidArgument('getAdapter pode chamar uma vez! '); });$mock = // crie um mock PHPUnit ou qualquer outro mock que você desejar.ServiceMocker::swap($this->container->get('filesystem.local.adapter'), $mock);// .. . $service = $this->container->get('filesystem.local.adapter'); $resultado = $serviço->getAdapter(); // O método de serviço (ou serviço de segurança) pode ser usado. }protected function tearDown(): void{// Para garantir que não afetaremos outros testesServiceMock::resetAll();// Você pode incluir a característica RestoreServiceContainer para redefinir serviços automaticamente} }
usar ProklTestingToolsTraitsBootTestKernelTrait;class ExampleTest estende ProklTestingToolsBaseBaseTestCase {use BootTestKernelTrait;função protegida setUp(): void{parent::setUp();$container = new ContainerBuilder(); // ... Verifica o teste contейнера.self::$kernel = $this->bootTestKernel($container); } }
Базовый класс для тестирования консольных команд.
Métodos:
executeCommand(Command $commandInstance, string $commandName, array $params = [])
- isso é o que o comando foi exibido na tela.
runCommand(Command $command, $input = [])
- é o resultado do método execute
de comandos.
Несколько общих дата-провайдеров
provideEmptyValue
- insira a propriedade.
provideEmptyScalarValue
- valor da escala
provideBooleanValue
- valor de valor
provideDateTimeInstance
- instância DateTime
provideNotExistingFilePath
- é necessário para o arquivo
Aberto agora.
Exemplo (no teste, usado em BaseTestCase
):
// Executar uma função (não é necessária com os parâmetros do processo de execução) função in_the_loop $this->mockerFunctions->setNamespace('TestsAPI') ->full('in_the_loop', verdadeiro) ->mock();
Namespace
- é um nome que pode ser encontrado na função mokaется.
Ou você pode escolher uma moeda (em termos de argumentos):
// Ao usar get_cat_name com o argumento $this->idCategory é a categoria simulada $this->mockerFunctions->setNamespace('TestAPIEntity') ->partial('get_cat_name', 'Categoria ridicularizada', $this->idCategory) ->partial('category_description', 'Descrição da categoria simulada', $this->idCategory) ->mock();
Para usar estas recomendações físicas (em caso de problema) nas seguintes anotações:
/** * data() * * @runInSeparateProcess * @preserveGlobalState desativado */
Construtor de serviços de localização do Symfony para testes.
Método:
constructServiceLocator(array $config)
- o valor máximo $config
é:
$object = new ClassName();$config = [ 'service_key' => ClassName::class, 'service_key2' => $object, ];
Se você mudar a classe na configuração, para abrir o método de classe será instalado instantaneamente.
Pacote de Fork
usar AppCommandCreateUserCommand; usar ProklTestingToolsBaseBaseTestCase; usar ProklTestingToolsToolsConsoleInteractsWithConsole; usar ProklTestingToolsTraitsBootTestKernelTrait;class CreateUserCommandTest estende BaseTestCase {use InteractsWithConsole;use BootTestKernelTrait; função protegida setUp(): void{parent::setUp();$container = new ContainerBuilder();$container->setDefinition( IntegrityCheck::class,nova Definição(IntegrityCheck::class, []) )->setTags(['console.command' => ['command' => 'module:еуые']])->setPublic(true);self::$kernel = $this->bootTestKernel($container); $this->cliApplication = novo SymfonyBundleFrameworkBundleConsoleApplication(self::$kernel);$this->cliApplication->add($container->get(IntegrityCheck::class)); } função pública test_can_create_user(): void{$this->executeConsoleCommand('create:user kbond --admin --role=ROLE_EMPLOYEE --role=ROLE_MANAGER') ->assertSuccessful() // o código de saída do comando é 0->assertOutputContains('Criando usuário administrador "kbond"') ->assertOutputContains('com funções: ROLE_EMPLOYEE, ROLE_MANAGER') ->assertOutputNotContains('usuário normal') ;// uso avançado$this->consoleCommand(CreateUserCommand::class) // pode usar o comando class ou "name"->splitOutputStreams() // por padrão stdout/stderr são combinados, esta opção os divide->addArgument( 'kbond') ->addOption('--admin') // com ou sem prefixo "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // opções de atalho requerem o prefixo "-"->addOption('-vv') // por padrão, a saída tem verbosidade normal, use as opções padrão para alterar (-q, -v , -vv, -vvv)->addOption('--ansi') // por padrão, a saída não é decorada, use esta opção para decorar->execute() // execute o comando->assertSuccessful() ->assertStatusCode(0) // equivalente a ->assertSuccessful()->assertOutputContains('Criando usuário administrador "kbond"') ->assertErrorOutputContains('this is in stderr') // usado em conjunto com ->splitOutputStreams()->assertErrorOutputNotContains('admin user') // usado em conjunto com ->splitOutputStreams()->dump() // dump () o código/saídas de status e continue->dd() // dd() o código/saídas de status;// teste interativo comandos$this->executeConsoleCommand('create:user', ['kbond']) ->afirmar com sucesso() ->assertOutputContains('Criando usuário regular "kbond"') ; // testes avançados de comandos interativos$this->consoleCommand(CreateUserCommand::class) ->addInput('kbond') ->addOption('--no-interaction') // comandos são executados interativamente se a entrada for fornecida, use esta opção para desabilitar->execute() ->afirmar com sucesso() ->assertOutputContains('Criando usuário regular "kbond"') ; // acessa resultado$result = $this->executeConsoleCommand('create:user');$result->statusCode();$result->output(); $resultado->errorOutput(); } }
Ou:
usar AppCommandCreateUserCommand; usar PHPUnitFrameworkTestCase; usar ProklTestingToolsToolsConsoleTestCommand;class CreateUserCommandTest estende TestCase {função pública test_can_create_user(): void{ TestCommand::for(new CreateUserCommand(/** args... */)) ->splitOutputStreams() // por padrão stdout/stderr são combinados, esta opção os divide->addArgument('kbond') ->addOption('--admin') // com ou sem prefixo "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // opções de atalho requerem o prefixo "-"->addOption('-vv') // por padrão, a saída tem verbosidade normal, use as opções padrão para alterar (-q, -v , -vv, -vvv)->addOption('--ansi') // por padrão, a saída não é decorada, use esta opção para decorar->execute() ->afirmar com sucesso() ->assertStatusCode(0) // equivalente a ->assertSuccessful()->assertOutputContains('Criando usuário administrador "kbond"') ->assertErrorOutputContains('this is in stderr') // usado em conjunto com ->splitOutputStreams()->assertErrorOutputNotContains('admin user') // usado em conjunto com ->splitOutputStreams()->dump() // dump () o código/saídas de status e continue->dd() // dd() o código/saídas de status; // testando comandos interativosTestCommand::for(new CreateUserCommand(/** args... */)) ->addInput('kbond') ->addOption('--no-interaction') // comandos são executados interativamente se a entrada for fornecida, use esta opção para desabilitar->execute() ->afirmar com sucesso() ->assertOutputContains('Criando usuário regular "kbond"') ;// acessar resultado$resultado = TestCommand::for(new CreateUserCommand(/** args... */))->execute();$resultado->statusCode();$resultado->output(); $resultado->errorOutput(); } }
classe MinhaClasse {string privada $privateProperty = 'valor privado'; função privada privateMethod(): string{return 'valor de retorno privado'; } }$minhaClasse = new Minhaclasse();
É assim que você pode obter o valor da propriedade privada usando a função invade
.
invadir($minhaClasse)->privateProperty; // retorna 'valor privado'
A função invade
também permite alterar valores privados.
invade($myClass)->privateProperty = 'valor alterado';invade($myClass)->privateProperty; // retorna 'valor alterado
Usando invade
você também pode chamar funções privadas.
invade($minhaClasse)->privateMethod(); // retorna 'valor de retorno privado'