INTERNO
composer require --dev proklung/phpunit-testing-tools
Создать clase:
use ProklTestingToolsBaseBaseTestCase;use ProklTestingToolsToolsContainerBuildContainer;la clase ContainerAwareBaseTestCase extiende BaseTestCase {/** * @inheritDoc * @throws Excepción */función protegida setUp(): void{$this->container = static::$testContainer = BuildContainer::getTestContainer( ['dev/test_container.yaml','dev/local.yaml'],'/Resources/config', [new SampleCompilerPass()], // Parámetro opcional: pases del compilador,'dev', // Окружение. По умолчанию - devtrue // Depurar. По умолчанию - true,['service_to_mock'] // Сервисы, подлежащие мокингу (см. подраздел Моки сервисов));parent::setUp(); } }
Отнаследовать от него тест.
Puede configurar servicios de configuración de archivos de archivos personalizados (pruebas DOCUMENT_ROOT originales).
El mecanismo (sobre la base de los servicios de procesamiento de datos de cada dispositivo) se utiliza en la banda y en el adaptador de las unidades locales.
utilice ProklTestingToolsToolsServiceMocker; utilice ProklTestingToolsBaseBaseTestCase; la clase MyTest extiende BaseTestCase {use RestoreServiceContainer; función protegida setUp(): void{parent::setUp(); $this->contenedor = BuildContainer::getTestContainer( ['test_container.yaml'],'/../../../../tests/Standalone/Resource/config', [],'dev',verdadero, ['filesystem.local.adapter'] // Сервис, который будет заменен моком.); }prueba de función públicaFoo() {// Para todas las llamadas ServiceMock::all($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . ' /prueba/'); }); $resultado = $this->container->get('filesystem.local.adapter');// Solo para la siguiente llamada ServiceMock::next($this->container->get('filesystem.local.adapter') , 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . '/test/'); }); // Esto pondrá en cola un nuevo ServiceMock::next($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { throw new InvalidArgument('getAdapter puede llamar una vez! '); });$mock = // crea un simulacro de PHPUnit o cualquier otro simulacro que desees.ServiceMocker::swap($this->container->get('filesystem.local.adapter'), $mock);// .. . $servicio = $this->contenedor->get('filesystem.local.adapter'); $resultado = $servicio->getAdapter(); // Метод сервиса (или сервис целиком) подменен. }función protegida tearDown(): void{// Para asegurarnos de que no afectemos a otras pruebasServiceMock::resetAll();// Puedes incluir el rasgo RestoreServiceContainer para restablecer automáticamente los servicios} }
utilice ProklTestingToolsTraitsBootTestKernelTrait; la clase EjemploTest extiende ProklTestingToolsBaseBaseTestCase {use BootTestKernelTrait; función protegida setUp(): void{parent::setUp();$container = new ContainerBuilder(); // ... Nombre del contenedor de prueba.self::$kernel = $this->bootTestKernel($container); } }
Clase básica para el comando de prueba.
Métodos:
executeCommand(Command $commandInstance, string $commandName, array $params = [])
- вернет то, что команда вывела на экран.
runCommand(Command $command, $input = [])
- вернет результат выполнения метода execute
команды.
Несколько общих дата-провайдеров
provideEmptyValue
: es necesario.
provideEmptyScalarValue
- una pequeña escala de valores
provideBooleanValue
- булевы значения
provideDateTimeInstance
- инстанц DateTime
provideNotExistingFilePath
- coloque un archivo nuevo
Обертка над.
Primero (en la prueba única de BaseTestCase
):
// Función de configuración in_the_loop $this->mockerFunctions->setNamespace('TestsAPI') ->full('in_the_loop', verdadero) ->simulacro();
Namespace
: espacio de nombres, en otras funciones.
Или частичное моканье (в зависимости от аргументов):
// Primero usamos get_cat_name con el argumento $this->idCategory вернет Categoría simulada $this->mockerFunctions->setNamespace('TestAPIEntity') ->partial('get_cat_name', 'Categoría simulada', $this->idCategory) ->partial('category_description', 'Descripción de categoría simulada', $this->idCategory) ->simulacro();
Para implementar estas cosas, recomendamos (en caso de problemas relacionados) en las anotaciones de la estación de prueba:
/** * datos() * * @runInSeparateProcess * @preserveGlobalState deshabilitado */
El constructor de servidores Symfony para pruebas.
Método:
constructServiceLocator(array $config)
- где $config
массив вида:
$objeto = new ClassName();$config = [ 'service_key' => ClassName::class, 'service_key2' => $objeto, ];
Si desea seleccionar una clase en la configuración, el método de clase se puede instalar de forma instantánea.
Paquete de tenedor
use AppCommandCreateUserCommand;use ProklTestingToolsBaseBaseTestCase;use ProklTestingToolsToolsConsoleInteractsWithConsole;use ProklTestingToolsTraitsBootTestKernelTrait;la clase CreateUserCommandTest extiende BaseTestCase {use InteractsWithConsole;use BootTestKernelTrait; función protegida setUp(): void{parent::setUp();$contenedor = new ContainerBuilder();$contenedor->setDefinition( IntegrityCheck::clase,nueva definición(IntegrityCheck::clase, []) )->setTags(['console.command' => ['command' => 'module:еуые']])->setPublic(true);self::$kernel = $this->bootTestKernel($container); $this->cliApplication = nuevo SymfonyBundleFrameworkBundleConsoleApplication(self::$kernel);$this->cliApplication->add($container->get(IntegrityCheck::class)); } función pública test_can_create_user(): void{$this->executeConsoleCommand('create:user kbond --admin --role=ROLE_EMPLOYEE --role=ROLE_MANAGER') ->assertSuccessful() // el código de salida del comando es 0->assertOutputContains('Creando usuario administrador "kbond"') ->assertOutputContains('con roles: ROLE_EMPLOYEE, ROLE_MANAGER') ->assertOutputNotContains('usuario normal') ;// uso avanzado$this->consoleCommand(CreateUserCommand::class) // puede usar la clase de comando o "nombre"->splitOutputStreams() // por defecto stdout/stderr se combinan, esta opción los divide->addArgument( 'kbond') ->addOption('--admin') // con o sin prefijo "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // las opciones de acceso directo requieren el prefijo "-"->addOption('-vv') // de forma predeterminada, la salida tiene un nivel de detalle normal, use las opciones estándar para cambiar (-q, -v , -vv, -vvv)->addOption('--ansi') // de forma predeterminada, la salida no está decorada, use esta opción para decorar->execute() // ejecuta el comando->assertSuccessful() ->assertStatusCode(0) // equivalente a ->assertSuccessful()->assertOutputContains('Creando usuario administrador "kbond"') ->assertErrorOutputContains('esto está en stderr') // usado junto con ->splitOutputStreams()->assertErrorOutputNotContains('usuario administrador') // usado junto con ->splitOutputStreams()->dump() // volcado () el código de estado/las salidas y continuar->dd() // dd() el código de estado/las salidas;// pruebas interactivas comandos$this->executeConsoleCommand('create:user', ['kbond']) ->afirmarExitoso() ->assertOutputContains('Creando usuario normal "kbond"') ; // comandos interactivos de prueba avanzada$this->consoleCommand(CreateUserCommand::class) ->añadirInput('kbond') ->addOption('--no-interaction') // los comandos se ejecutan interactivamente si se proporciona información, use esta opción para desactivar->ejecutar() ->afirmarExitoso() ->assertOutputContains('Creando usuario normal "kbond"') ; // accede al resultado$resultado = $this->executeConsoleCommand('create:user');$resultado->statusCode();$resultado->salida(); $resultado->errorOutput(); } }
Или:
use AppCommandCreateUserCommand;use PHPUnitFrameworkTestCase;use ProklTestingToolsToolsConsoleTestCommand;la clase CreateUserCommandTest extiende TestCase {función pública test_can_create_user(): nulo{ TestCommand::for(new CreateUserCommand(/** args... */)) ->splitOutputStreams() // por defecto stdout/stderr se combinan, esta opción los divide->addArgument('kbond') ->addOption('--admin') // con o sin prefijo "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // las opciones de acceso directo requieren el prefijo "-"->addOption('-vv') // de forma predeterminada, la salida tiene un nivel de detalle normal, use las opciones estándar para cambiar (-q, -v , -vv, -vvv)->addOption('--ansi') // de forma predeterminada, la salida no está decorada, use esta opción para decorar->ejecutar() ->afirmarExitoso() ->assertStatusCode(0) // equivalente a ->assertSuccessful()->assertOutputContains('Creando usuario administrador "kbond"') ->assertErrorOutputContains('esto está en stderr') // usado junto con ->splitOutputStreams()->assertErrorOutputNotContains('usuario administrador') // usado junto con ->splitOutputStreams()->dump() // volcado () el código de estado/salidas y continuar->dd() // dd() el código de estado/salidas; // probando comandos interactivosTestCommand::for(new CreateUserCommand(/** args... */)) ->añadirInput('kbond') ->addOption('--no-interaction') // los comandos se ejecutan interactivamente si se proporciona información, use esta opción para desactivar->ejecutar() ->afirmarExitoso() ->assertOutputContains('Creando usuario normal "kbond"') ;// acceder al resultado$resultado = TestCommand::for(new CreateUserCommand(/** args... */))->execute();$resultado->statusCode();$resultado->salida(); $resultado->errorOutput(); } }
clase MiClase {cadena privada $privateProperty = 'valor privado'; función privada privateMethod(): string{return 'valor de retorno privado'; } }$miClase = new Miclase();
Así es como puedes obtener el valor de la propiedad privada usando la función invade
.
invade($myClass)->privateProperty; // devuelve 'valor privado'
La función invade
también le permite cambiar valores privados.
invade($myClass)->privateProperty = 'valor cambiado';invade($myClass)->privateProperty; // devuelve 'valor cambiado
Usando invade
también puedes llamar a funciones privadas.
invade($miClase)->privateMethod(); // devuelve 'valor de retorno privado'