Laravel伪造文件在工厂无法正常工作

时间:2018-10-22 11:52:43

标签: laravel file unit-testing faker laravel-testing

我正在使用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

那为什么不起作用?我该如何解决它以及我的代码有什么问题。

1 个答案:

答案 0 :(得分: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 +