INTERNE
composer require --dev proklung/phpunit-testing-tools
Создать класс:
utiliser ProklTestingToolsBaseBaseTestCase ; utiliser ProklTestingToolsToolsContainerBuildContainer ; la classe ContainerAwareBaseTestCase étend BaseTestCase {/** * @inheritDoc * @throws Exception */protected function setUp(): void{$this->container = static::$testContainer = BuildContainer::getTestContainer( ['dev/test_container.yaml','dev/local.yaml'],'/Resources/config', [new SampleCompilerPass()], // Paramètres supplémentaires - passes du compilateur en cours, 'dev', // Mise à jour. По умолчанию - devtrue // Debug. По умолчанию - true,['service_to_mock'] // Les services, подлежащие мокингу (см. подраздел Моки сервисов));parent::setUp(); } }
Отнаследовать от него test.
Vous pouvez ajouter des services de configuration à des fichiers de configuration en utilisant des tests DOCUMENT_ROOT spécifiques.
Le mécanisme (de base sur les services de proxy pour la surveillance) s'applique à la bande et s'adapte aux besoins locaux.
utiliser ProklTestingToolsToolsServiceMocker ; utiliser ProklTestingToolsBaseBaseTestCase ; la classe MyTest étend BaseTestCase {utilisez RestoreServiceContainer;protected function setUp() : void{parent::setUp(); $this->container = BuildContainer::getTestContainer( ['test_container.yaml'],'/../../../../tests/Standalone/Resource/config', [], 'dev', vrai, ['filesystem.local.adapter'] // Сервис, который будет заменен моком.); }fonction publique testFoo() {// Pour tous les appels ServiceMock::all($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . ' /test/'); }); $result = $this->container->get('filesystem.local.adapter');// Pour le prochain appel uniquement ServiceMock::next($this->container->get('filesystem.local.adapter') , 'getAdapter', function () { return new Local( $_SERVER['DOCUMENT_ROOT'] . '/test/'); }); // Cela mettra en file d'attente un nouveau ServiceMock::next($this->container->get('filesystem.local.adapter'), 'getAdapter', function () { throw new InvalidArgument('getAdapter peut appeler une fois ! '); });$mock = // créez un mock PHPUnit ou tout autre mock de votre choix.ServiceMocker::swap($this->container->get('filesystem.local.adapter'), $mock);// .. . $service = $this->container->get('filesystem.local.adapter'); $result = $service->getAdapter(); // La méthode de service (ou service de service) est appliquée. }protected function tearDown(): void{// Pour vous assurer que nous n'affectons pas les autres testsServiceMock::resetAll();// Vous pouvez inclure le trait RestoreServiceContainer pour réinitialiser automatiquement les services} }
utiliser ProklTestingToolsTraitsBootTestKernelTrait ; la classe SampleTest étend ProklTestingToolsBaseBaseTestCase {utilisez BootTestKernelTrait;protected function setUp() : void{parent::setUp();$container = new ContainerBuilder(); // ... Наполнение тестового контейнера.self::$kernel = $this->bootTestKernel($container); } }
Classe de base pour tester la commande de la console.
Méthodes :
executeCommand(Command $commandInstance, string $commandName, array $params = [])
- cela signifie que la commande apparaît sur l'écran.
runCommand(Command $command, $input = [])
- afficher le résultat de la méthode execute
des commandes.
Несколько общих дата-провайдеров
provideEmptyValue
- valeur disponible.
provideEmptyScalarValue
- Mise à jour rapide
provideBooleanValue
- Points d'informations
provideDateTimeInstance
- dateTime instantanée
provideNotExistingFilePath
- ajouter le fichier souhaité
Обертка над.
Exemple (dans le test, non compatible avec BaseTestCase
):
// La fonction est disponible (mais vous ne pouvez pas utiliser les paramètres que vous utilisez) fonction in_the_loop $this->mockerFunctions->setNamespace('TestsAPI') ->complet('in_the_loop', vrai) ->mock();
Namespace
de noms - il s'agit d'un espace qui correspond à votre fonction.
Il y a une chose vraiment chaste (dans les commentaires des arguments) :
// Lorsque vous utilisez get_cat_name avec l'argument $this->idCategory, vous obtenez la catégorie simulée $this->mockerFunctions->setNamespace('TestAPIEntity') ->partial('get_cat_name', 'Catégorie moquée', $this->idCategory) ->partial('category_description', 'Description de catégorie simulée', $this->idCategory) ->mock();
Lors de l'utilisation de ces fiches, il est recommandé (pour résoudre le problème) de tester les notes :
/** * data() * * @runInSeparateProcess * @preserveGlobalState désactivé */
Constructeur de services de localisation Symfony pour les tests.
Méthode :
constructServiceLocator(array $config)
- voir $config
beaucoup plus :
$object = new ClassName();$config = [ 'service_key' => ClassName::class, 'service_key2' => $object, ];
Si vous avez choisi la classe dans la configuration, votre méthode de classe est de l'installer.
Paquet de fourchette
utiliser AppCommandCreateUserCommand ; utiliser ProklTestingToolsBaseBaseTestCase ; utiliser ProklTestingToolsToolsToolsConsoleInteractsWithConsole ; utiliser ProklTestingToolsTraitsBootTestKernelTrait ; la classe CreateUserCommandTest étend BaseTestCase {utilisez InteractsWithConsole ; utilisez BootTestKernelTrait ; fonction protégée setUp() : void{parent::setUp();$container = new ContainerBuilder();$container->setDefinition( IntegrityCheck::class,nouvelle définition(IntegrityCheck::class, []) )->setTags(['console.command' => ['command' => 'module:еуые']])->setPublic(true);self::$kernel = $this->bootTestKernel($container); $this->cliApplication = nouveau SymfonyBundleFrameworkBundleConsoleApplication(self::$kernel);$this->cliApplication->add($container->get(IntegrityCheck::class)); } fonction publique test_can_create_user() : void{$this->executeConsoleCommand('create:user kbond --admin --role=ROLE_EMPLOYEE --role=ROLE_MANAGER') ->assertSuccessful() // le code de sortie de la commande est 0->assertOutputContains('Création de l'utilisateur administrateur "kbond"') ->assertOutputContains('avec rôles : ROLE_EMPLOYEE, ROLE_MANAGER') ->assertOutputNotContains('utilisateur régulier') ;// utilisation avancée$this->consoleCommand(CreateUserCommand::class) // peut utiliser la classe de commande ou "name"->splitOutputStreams() // par défaut stdout/stderr sont combinés, cette option les divise->addArgument( 'kbond') ->addOption('--admin') // avec ou sans préfixe "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // les options de raccourci nécessitent le préfixe "-"->addOption('-vv') // par défaut, la sortie a une verbosité normale, utilisez les options standard pour changer (-q, -v , -vv, -vvv)->addOption('--ansi') // par défaut, la sortie n'est pas décorée, utilisez cette option pour décorer->execute() // exécute la commande->assertSuccessful() ->assertStatusCode(0) // équivalent à ->assertSuccessful()->assertOutputContains('Création de l'utilisateur administrateur "kbond"') ->assertErrorOutputContains('this is in stderr') // utilisé en conjonction avec ->splitOutputStreams()->assertErrorOutputNotContains('admin user') // utilisé en conjonction avec ->splitOutputStreams()->dump() // dump () le code d'état/les sorties et continue->dd() // dd() le code d'état/les sorties ;// test interactif commandes$this->executeConsoleCommand('create:user', ['kbond']) ->assertSuccessful() ->assertOutputContains('Création d'un utilisateur régulier "kbond"') ; // commandes interactives de tests avancés$this->consoleCommand(CreateUserCommand::class) ->addInput('kbond') ->addOption('--no-interaction') // les commandes sont exécutées de manière interactive si une entrée est fournie, utilisez cette option pour désactiver->execute() ->assertSuccessful() ->assertOutputContains('Création d'un utilisateur régulier "kbond"') ; // accès au résultat$result = $this->executeConsoleCommand('create:user');$result->statusCode();$result->output(); $result->errorOutput(); } }
Voici :
utiliser AppCommandCreateUserCommand ; utiliser PHPUnitFrameworkTestCase ; utiliser ProklTestingToolsToolsConsoleTestCommand ; la classe CreateUserCommandTest étend TestCase {fonction publique test_can_create_user() : void{ TestCommand::for(new CreateUserCommand(/** args... */)) ->splitOutputStreams() // par défaut stdout/stderr sont combinés, cette option les divise->addArgument('kbond') ->addOption('--admin') // avec ou sans préfixe "--"->addOption('role', ['ROLE_EMPLOYEE', 'ROLE_MANAGER']) ->addOption('-R') // les options de raccourci nécessitent le préfixe "-"->addOption('-vv') // par défaut, la sortie a une verbosité normale, utilisez les options standard pour changer (-q, -v , -vv, -vvv)->addOption('--ansi') // par défaut, la sortie n'est pas décorée, utilisez cette option pour décorer->exécuter() ->assertSuccessful() ->assertStatusCode(0) // équivalent à ->assertSuccessful()->assertOutputContains('Création de l'utilisateur administrateur "kbond"') ->assertErrorOutputContains('this is in stderr') // utilisé en conjonction avec ->splitOutputStreams()->assertErrorOutputNotContains('admin user') // utilisé en conjonction avec ->splitOutputStreams()->dump() // dump () le code d'état/les sorties et continue->dd() // dd() le code d'état/les sorties ; // test des commandes interactivesTestCommand::for(new CreateUserCommand(/** args... */)) ->addInput('kbond') ->addOption('--no-interaction') // les commandes sont exécutées de manière interactive si une entrée est fournie, utilisez cette option pour désactiver->execute() ->assertSuccessful() ->assertOutputContains('Création d'un utilisateur régulier "kbond"') ;// accès au résultat$result = TestCommand::for(new CreateUserCommand(/** args... */))->execute();$result->statusCode();$result->output(); $result->errorOutput(); } }
classe MaClasse {chaîne privée $privateProperty = 'valeur privée'; fonction privée privateMethod() : string{return 'valeur de retour privée'; } }$maClasse = new MaClasse();
C'est ainsi que vous pouvez obtenir la valeur de la propriété privée à l'aide de la fonction invade
.
envahir($myClass)->privateProperty; // renvoie 'valeur privée'
La fonction invade
vous permet également de modifier les valeurs privées.
envahir($myClass)->privateProperty = 'valeur modifiée';invade($myClass)->privateProperty; // renvoie la "valeur modifiée"
En utilisant invade
vous pouvez également appeler des fonctions privées.
envahir($myClass)->privateMethod(); // renvoie la "valeur de retour privée"