内部
composer require --dev proklung/phpunit-testing-tools
Создать класс:
ProklTestingToolsBaseBaseTestCase を使用する;ProklTestingToolsToolsContainerBuildContainer を使用する;クラス ContainerAwareBaseTestCase は BaseTestCase を拡張します {/** * @inheritDoc * @throws 例外 */protected function 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'] // Сервисы, подлежащие мокингу (см. подраздел Моки сервисов));parent::setUp(); } }
Отнаследовать от него тест。
Подгрузятся конфиги сервисов из указанных файлов по указанному пути (относительно DOCUMENT_ROOT тестов)。
Механизм (на базе создания прокси-сервисов по заданному списку) взят из бандла и адаптирован под локальные нужды.
ProklTestingToolsToolsServiceMocker を使用する;ProklTestingToolsBaseBaseTestCase を使用する;クラス MyTest は BaseTestCase を拡張します {RestoreServiceContainer を使用する;保護された関数 setUp(): void{parent::setUp(); $this->container = BuildContainer::getTestContainer( ['test_container.yaml'],'/../../../../tests/Standalone/Resource/config', [],'開発',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 は 1 回だけ呼び出すことができます! '); });$mock = // PHPUnit モックまたはその他の必要なモックを作成します。ServiceMocker::swap($this->container->get('filesystem.local.adapter'), $mock);// .. 。 $service = $this->container->get('filesystem.local.adapter'); $result = $service->getAdapter(); // Метод сервиса (или сервис целиком) подменен. }protected function bearDown(): void{// 他の testingServiceMock::resetAll();// サービスを自動的にリセットする RestoreServiceContainer トレイトを含めることができます。 }
ProklTestingToolsTraitsBootTestKernelTrait を使用する;クラス 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
- DateTime
provideNotExistingFilePath
- Суть к несуществующему файлу
Обертка над.
例 ( BaseTestCase
を使用する):
// Замокается полностью (т.е. не важно с какими параметрами пройдет вызов) функция in_the_loop $this->mockerFunctions->setNamespace('TestsAPI') ->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 を使用する;クラス CreateUserCommandTest は BaseTestCase を拡張します {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 = 新しいSymfonyBundleFrameworkBundleConsoleApplication(self::$kernel);$this->cliApplication->add($container->get(IntegrityCheck::class)); public function 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( 「絆」) ->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() と組み合わせて使用されます // ダンプ() ステータス コード/出力と continue->dd() // dd() ステータス コード/出力;// 対話型テストコマンド$this->executeConsoleCommand('create:user', ['kbond']) ->assertSuccessful() ->assertOutputContains('一般ユーザー「kbond」の作成') ; // 高度なテストの対話型コマンド$this->consoleCommand(CreateUserCommand::class) ->addInput('kbond') ->addOption('--no-interaction') // 入力が提供された場合、コマンドは対話的に実行されます。このオプションを使用して disable->execute() ->assertSuccessful() ->assertOutputContains('一般ユーザー「kbond」の作成') ; // result にアクセス $result = $this->executeConsoleCommand('create:user');$result->statusCode();$result->output(); $result->errorOutput(); } }
例:
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') // デフォルトでは、出力は装飾されていません。このオプションを使用して、decorate->execute() ->assertSuccessful() ->assertStatusCode(0) // ->assertSuccessful()->assertOutputContains('管理者ユーザー "kbond" の作成') と同等 ->assertErrorOutputContains('this is in stderr') // ->splitOutputStreams()->assertErrorOutputNotContains('admin user') と組み合わせて使用されます // ->splitOutputStreams()->dump() と組み合わせて使用されます // ダンプ() ステータス コード/出力、および continue->dd() // dd() ステータス コード/出力。 // 対話型コマンドのテストTestCommand::for(new CreateUserCommand(/** args... */)) ->addInput('kbond') ->addOption('--no-interaction') // 入力が提供された場合、コマンドは対話的に実行されます。このオプションを使用して disable->execute() ->assertSuccessful() ->assertOutputContains('一般ユーザー「kbond」の作成') ;// アクセス result$result = TestCommand::for(new CreateUserCommand(/** args... */))->execute();$result->statusCode();$result->output(); $result->errorOutput(); } }
クラスMyClass {プライベート文字列 $privateProperty = 'プライベート値';プライベート関数 privateMethod(): string{return 'プライベート戻り値'; } }$myClass = 新しい Myclass();
これは、 invade
関数を使用してプライベート プロパティの値を取得する方法です。
侵入($myClass)->privateProperty; // 'プライベート値' を返します
invade
機能を使用すると、プライベート値を変更することもできます。
invade($myClass)->privateProperty = '変更された値';invade($myClass)->privateProperty; // '変更された値を返します
invade
使用すると、プライベート関数を呼び出すこともできます。
侵入($myClass)->privateMethod(); // 'プライベート戻り値' を返します