У меня есть маршрут в Laravel 7, который сохраняет файл на диск S3 и возвращает ему временный URL. Упрощенный код выглядит следующим образом:
Storage::disk('s3')->put('image.jpg', $file);
return Storage::disk('s3')->temporaryUrl('image.jpg');
Я хочу написать тест для этого маршрута. Обычно это просто с Laravel. Я издеваюсь над хранилищем с помощью Storage::fake('s3')
и утверждаю создание файла с помощью Storage::disk('s3')->assertExists('image.jpg')
.
. Поддельное хранилище не поддерживает Storage::temporaryUrl()
. При попытке использовать этот метод он выдает следующую ошибку:
Этот драйвер не поддерживает создание временных URL-адресов.
Обычный обходной путь должен использовать * API низкоуровневого моделирования 1034 *, подобный следующему:
Storage::shouldReceive('temporaryUrl')
->once()
->andReturn('http://examples.com/a-temporary-url');
Это решение рекомендуется в потоке LaraCasts и GitHub, выпуск об этом ограничении Storage::fake()
.
Можно ли как-нибудь объединить эти два подхода для проверки маршрута, который выполняет оба действия?
Я бы хотел избежать повторной реализации Storage::fake()
. Также я хотел бы избежать добавления проверки в производственный код, чтобы не вызывать Storage::temporaryUrl()
, если среда тестирует. Последний - это еще один обходной вариант, предложенный в ветке LaraCasts , уже упомянутой выше.