Макет файла в хранилище для загрузки в Laravel - PullRequest
0 голосов
/ 25 декабря 2018

Есть ли способ смоделировать файл, используя метод Laravels Storage::fake()?

Я использовал https://laravel.com/docs/5.7/mocking#storage-fake в качестве базы для своих тестов, которая отлично работает для загрузки.Но мои тесты загрузки уродливы, так как мне приходится каждый раз сначала запускать маршрут загрузки с фиктивной загрузкой UploadedFile::fake()->image('avatar.jpg').Есть ли способ пропустить эту часть и смоделировать файл, чтобы он существовал непосредственно в поддельной системе хранения?

public function testAvatarUpload()
{
    Storage::fake('avatars');

    // This is the call I would like to change into a mocked existing uploaded file
    $uploadResponse = $this->json('POST', '/avatar', [
        'avatar' => UploadedFile::fake()->image('avatar.jpg')
    ]);

    // Download the first avatar
    $response = $this->get('/download/avatar/1');

    $response->assertStatus(200);
}

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

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

определяет ваш тест следующим образом:

use Tests\TestCase;

class ExampleTest extends TestCase {
    protected function setUp() {
        parent::setUp();
        Storage::fake('avatars');
        $uploadResponse = $this->json('POST', '/avatar', [
          'avatar' => UploadedFile::fake()->image('avatar.jpg')
        ]);
    }
    protected function tearDown() {
        parent::tearDown();
    }
    public function testAvatarUpload() {
        // Download the first avatar
        $response = $this->get('/download/avatar/1');

        $response->assertStatus(200);
    }
}

setUp и tearDown вызывают соответственно, до и после каждого теста в классе.Таким образом, перед каждым методом тестирования setUp стирает фальшивый диск avatars и запускает запрос.Поскольку после теста нечего делать (поскольку Storage::fake() заменяет диск, если он уже существует), метод пуст;Я оставил это здесь только для того, чтобы завершить пример.

Здесь есть довольно хорошая документация об этой функции PHPunit.

Что касается размещения файла там, один разу вас setUp работает правильно, ничто не мешает вам выбросить на него файл.

0 голосов
/ 08 марта 2019

Я могу опоздать сюда.но хотел помочь другим посетителям этого вопроса, чтобы дать представление о его реализации.

Вот пример с некоторыми утверждениями.

<?php

namespace Tests\Feature\Upload;

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;

class SampleDownloadTest extends TestCase
{
    /**
     * @test
     */
    public function uploaded_file_downloads_correctly()
    {
        //keep a sample file inside projectroot/resources/files folder
        //create a file from it
        $exampleFile = new File(resource_path('files/test-file.png'))
        //copy that file to projectroot/storage/app/uploads folder
        Storage::putFileAs('/uploads', $exampleFile, 'test-file.png');

        //make request to file download url to get file 
        $response = $this->get("/files/file/download/url");

        //check whethe response was ok
        $response->assertOk();
        $response->assertHeader('Content-Type', 'image/png')
        //check whether file exists in path
        Storage::assertExists('/uploads/test-file.png');
        //do some more assertions.....
        //after test delete the file from storage path
        Storage::delete('uploads/test-file.png');
        //check whether file was deleted
        Storage::assertMissing('/uploads/test-file.png');
    }
}
0 голосов
/ 25 декабря 2018

Вы можете просто создать новый файл напрямую или скопировать определенный тестовый файл, например:

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;

// for simple text files or if the content doesn't matter
Storage::disk('avatars')->put('avatar.jpg', 'some non-jpg content');

// if you need a specific file for your test
$file = new File(base_path('tests/resources/avatar.jpg'));
Storage::disk('avatars')->putFileAs('/', $file, 'avatar.jpg');

Последняя функция возьмет $file и скопирует его под заданным именем avatar.jpg вданный каталог / на диске avatars.Подробнее об этом вы можете прочитать в официальной документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...