Поддельный файл Laravel на заводе не работает - PullRequest
0 голосов
/ 22 октября 2018

Я занимаюсь разработкой веб-приложения с использованием Laravel.Я выполняю модульное тестирование своего приложения, которое включает файловую операцию.Посмотрите на мой сценарий ниже.

У меня есть действие загрузки файла в контроллере, как это

public function downloadPersonalDetails(Order $order)
{
    if (! auth()->user()->can('downloadPersonalDetails', $order)) {
        abort(401);
    }

    return Storage::download($order->path);
}

У меня есть фабрика, подобная этой OrderFactory.php

$factory->define(Application::class, function (Faker $faker) {
    return [
        'first_name' => $faker->firstName,
        'last_name' => $faker->lastName,
        'email' => $faker->email,
        //other fields ....
        'path' => $faker->file('public/assets/files'),
});

Это мой модульный тест для этого действия загрузки

public function test_download_personal_details_file()
    {
        $user = //created a authorized valid user

        $order = factory(Order::class)
            ->create([
               'user' => $user->id
            ]);


        $this->actingAs($user)->get(route('order.personal_info.download', $order))->assertStatus(200);
    }

При запуске теста появляется сообщение о том, что файл не существует.

File not found at path: tmp/439fe03f-f1c7-3b84-b123-d627d0395bd8.pdf

Почему это не работает?Как я могу это исправить и что не так с моим кодом.

1 Ответ

0 голосов
/ 22 октября 2018

Фейкер просто создаст поддельное имя файла, однако это имя файла не будет соответствовать ни одному действительному файлу.Вам также нужно будет подделать его в хранилище:

public function test_download_personal_details_file()
{
    $user = //created a authorized valid user

    $order = factory(Order::class)
        ->create([
           'user' => $user->id
        ]);
    \Storage::fake(config('filesystems.default')); //or any storage you need to fake
    \Storage::put($order->path, ''); //Empty file

    $this->actingAs($user)->get(route('order.personal_info.download', $order))->assertStatus(200);

}

Это создаст файл в поддельном хранилище (поэтому он фактически не будет записывать на диск).

Для этого требуется Laravel 5.4 +

...