Laravel 工厂伪造文件无效
Laravel faking file in the factory not working
我正在使用 Laravel 开发 Web 应用程序。我正在对涉及文件操作的应用程序进行单元测试。看看下面我的场景。
我在控制器中有这样一个下载文件操作
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
为什么不起作用?我该如何解决它以及我的代码有什么问题。
造假者只会创建一个假文件名,但该文件名不会与任何实际文件相对应。您还需要在存储中伪造它:
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+
我正在使用 Laravel 开发 Web 应用程序。我正在对涉及文件操作的应用程序进行单元测试。看看下面我的场景。
我在控制器中有这样一个下载文件操作
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
为什么不起作用?我该如何解决它以及我的代码有什么问题。
造假者只会创建一个假文件名,但该文件名不会与任何实际文件相对应。您还需要在存储中伪造它:
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+