@FernandoErrNando

Как правильно тестировать работу с кэшем в Symfony?

У меня есть метод, который должен получить данные из кэша, если их там нет, сделать запрос во внешний сервис. Соответственно пишется на это тест, который проверяет, что данные пришли из кэша или из внешнего источника.

В Laravel мой код упрощенно выглядит примерно как-то так:

public function getExternalData($key)
    {
        $response = Cache::get($key, null);

        if (!$response) {
            $response = $this->externalSource->getData($key); // heavy and complicated request
            Cache::set($key, $response;
        }

        return response;
    }

а код тестов:

public function testFromCache($returnData)
    {
        Cache::shouldReceive('get')->once()->andReturn($returnData);
    }

public function testFromSource($returnData)
    {
        Cache::shouldReceive('get')->once()->andReturn(null);

        $externalSourceMock = $this->partialMock(
            Source::class,
            function (MockInterface $mock) use ($returnData) {
                $mock->shouldReceive('getData')->once()->andReturn($returnData);
            }
        );

        Cache::shouldReceive('set')->once()->andReturn(true);
    }

В симфони немного по-другому устроено кэширование, поэтому код сложнее:

public function __construct(
        private HttpClientInterface $client,
        private CacheInterface $cache,
        private LoggerInterface $logger
    ) {
    }

public function getExternalData( $key ) {
        $responseDto = $this->cache->get($key, function () use ($key) {
            $response = $this->externalSource->getData($key); // heavy and complicated 
            return $response;
        });
    }

Общий вопрос звучит так: Как правильно написать тесты, аналогичные вышеописанным для symfony?
Более мелкие вопросы:

1. Как проверить наличие или отсутствие данных ИМЕННО в кэше?
2. Как замокать правильно результат запроса во внешний сервис внутри callable-функции?
3. Нужно ли проверять запись в кэш в таком коде, если да, то как?
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы