У меня есть метод, который должен получить данные из кэша, если их там нет, сделать запрос во внешний сервис. Соответственно пишется на это тест, который проверяет, что данные пришли из кэша или из внешнего источника.
В 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. Нужно ли проверять запись в кэш в таком коде, если да, то как?