Насмешка над загруженным файлом с контентом
Я работаю над проектом Laravel, который использует GraphQL с Lighthouse для API бэкенда. Для некоторых конечных точек у нас есть поддержка загрузки файлов. Мы успешно проверили это.
Новая конечная точка, которую мы создаем прямо сейчас, также будет поддерживать загрузку файлов. Но вместо того, чтобы просто хранить файл где-то на нашем сервере, мы должны прочитать содержимое этого файла и сделать что-то в зависимости от этого содержимого.
Мы хотим протестировать эту новую функцию, конечно. Но для этого. Мы должны смоделировать загруженный файл с определенным содержимым, чтобы проверить это. Все, что я мог найти, это просто подделка UploadedFile::fake()
метод, который создает случайный / пустой файл для вас.
Я знаю, что мог бы создать модульные тесты для этого. Но я действительно хочу добавить сквозной тест.
Официальные документы маяка имеют следующий пример кода:
<?php
$this->multipartGraphQL(
[
'operations' => /* @lang JSON */
'
{
"query": "mutation Upload($file: Upload!) { upload(file: $file) }",
"variables": {
"file": null
}
}
',
'map' => /* @lang JSON */
'
{
"0": ["variables.file"]
}
',
],
[
'0' => UploadedFile::fake()->create('image.jpg', 500),
]
)
Мне нужно заменить этот загруженный файл на макет, который я создал сам. Может быть что-то вроде:
<?php
UploadedFile::fake()
->fromPath('example/file/in/my/testsuite.obj')
->create()
Есть ли какой-нибудь встроенный способ, которым я могу установить содержимое поддельного загруженного файла? Или я могу как-то расширить класс с помощью собственной фабричной логики?
2 ответа
Чтобы подделать файл в Laravel на основе тестового файла, вы можете использовать new File
, Класс Illuminate\Http\File
,
Конструктор берет путь и дает вам файл из этого пути к файлу. Таким образом, чтобы использовать ваш пример, поддельный файл будет создан следующим образом
new File('example/file/in/my/testsuite.obj')
Затем вам просто нужно установить файл, который вы отправили в Lighthouse для этого файла.
Если вам действительно нужен тип UploadedFile, вы можете создать его следующим образом:
use Illuminate\Http\UploadedFile;
$uploadedFile = new UploadedFile('example/file/in/my/testsuite.obj'), 'testsuite.obj')