Поддельный файл Laravel на заводе не работает
Я разрабатываю веб-приложение с использованием 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 ответ
Фейкер просто создаст поддельное имя файла, однако это имя файла не будет соответствовать ни одному действительному файлу. Вам также нужно будет подделать его в хранилище:
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+