symfony codeception Мок валидатора - подмена сетевого валидатора для функциональных тестов

Возможное решение

Для начала нужно получить именно тот контейнер, который реально используется для эмуляции сетевого запроса в ваших тестах.
После того как вы определились на чем именно (на каком объекте) вызывать getContainer() или подобный метод получающий контейнер, мок можно провести с помощью метода вроде:

protected KernelBrowser $client;


protected function mockSymfonyContainerElement(string $className, object $object) {
  $this->client->getContainer()->set($className, $object);
}

Например:

protected function mockTagsValidator() {
   $this->mockSymfonyContainerElement(
    \App\Validator\TagsExistValidator::class,
     new TagsExistValidatorMock()
  );
 }

Комментарии к этой же проблеме в видео:

Прочие материалы

Судя по всему проблема это известная: https://stackoverflow.com/questions/5057...

How to mock service with symfony 4 in functional tests?

Что посмотреть:

как сделать мок класса из контейнера symfony в codeception для функционального теста cest-класса
symfony mock custom validator in test

vedro-compota's picture

Команда для создания хэлпера для мока:

./vendor/bin/codecept generate:helper MockHelper

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

Service `container` is required by Codeception, but not loaded by Symfony since you're not using it anywhere in your app

Ошибка для кода:

    public function _before(FunctionalTester $I, )
    {
        parent::_before($I);

        $container = $I->grabService('container');
        $container->set('service_id', \App\Validator\TagsExistValidator::class, new TagsExistValidatorMock());
        
    }

на базе идеи https://github.com/Codeception/module-sy...

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

черновик неработающего решения:

<pre class="brush: php">class PostCest extends BaseFunctionalCest
{
    protected int $postId;
    protected array $errors = ['title' => null, 'tags' => null];

    public function _before(FunctionalTester $I, )
    {
        parent::__construct($I);
        

        $newsRepository = $I->make(TagsExistValidator::class, [
            'validate' => null,
        ]);
        

        $container->set(NewsRepositoryInterface::class, $newsRepository);
    }
</pre>

_____________
матфак вгу и остальная классика =)