Насмешка над загруженным файлом с контентом

Я работаю над проектом 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')
Другие вопросы по тегам