如何使用 Storage::fake 为 phpunit 制作一个假的 storage_path()

问题描述 投票:0回答:1

我正在开发一个 Laravel 站点,该站点利用本地存储来存储每日摘要文件,本质上是填充 JSON 的日志文件。我保存的文件夹位于

storage/history
目录中,我的许多功能都通过
storage_path('history')
访问该目录。我正在为该过程中涉及的函数编写 PHPUnit 测试,其中包括删除此摘要文件夹中所有文件的函数。我想避免删除真实的
storage/history
文件夹中的文件,因此我一直在探索指示 Laravel 使用不同文件夹进行这些操作的方法。
Storage::fake(...)
似乎是我需要的解决方案。然而,尽管多次尝试实现它,我还没有找到正确的方法。

  1. Storage::fake(storage_path());
    给我以下错误:
    • League\Flysystem\UnableToCreateDirectory:无法在 C:\xxx\yyy\storage ramework/testing/disks/C:\xxx\yyy\storage 创建目录。
  2. Storage::fake('storage');
    失败,因为测试删除了真实文件。

请帮助我理解我在这里做错了什么。如何伪造

storage_path()
文件夹进行测试?

laravel mocking local-storage phpunit storage
1个回答
0
投票

模拟文件操作部分,而不是

storage_path()

Storage::fake()
不相关。

use Illuminate\Support\Facades\File;

$file = storage_path('history/test.log');

File::delete($file);

测试

use Illuminate\Support\Facades\File;

File::shouldReceive('delete')->once();

另一种方式

添加历史盘。

// config/filesystems.php

    'disks' => [

        'history' => [
            'driver' => 'local',
            'root' => storage_path('history'),
        ],

使用方法

use Illuminate\Support\Facades\Storage;

Storage::disk('history')->put('test.log', 'test');

Storage::disk('history')->delete('test.log');

测试

use Illuminate\Support\Facades\Storage;

Storage::fake('history');

...

Storage::disk('history')->assertMissing('test.log');
© www.soinside.com 2019 - 2024. All rights reserved.