【问题标题】:Laravel test unable to find a file at path using Storage::fake()Laravel 测试无法使用 Storage::fake() 在路径中找到文件
【发布时间】:2020-05-24 22:05:01
【问题描述】:

我在config/filesystems.php 中创建了自己的“磁盘”,看起来像这样;

'uploads' => [
    'driver' => 'local',
    'root' => storage_path('app/public') . '/uploads'
],

这在我的控制器中似乎工作正常,它上传文件并返回响应。我的代码如下;

public function store(Request $request)
{
    if ($request->hasFile('filename')) {
        foreach ($request->file('filename') as $image) {
            $fileName = md5($image . microtime()) . '.' . $image->getClientOriginalExtension();
            $image->storeAs('', $fileName, 'uploads');
        }
    }

    // return goes here
}

但是当我使用下面的代码去测试我的 store 方法时;

public function testUserCanSuccessfullySubmitSingleImage(): void
{
    Storage::fake('uploads');

    $this->postJson('/upload', [
        'filename' => UploadedFile::fake()->image('image1.jpg')
    ]);

    Storage::disk('uploads')->assertExists('image1.jpg');
    Storage::disk('uploads')->assertMissing('missing.jpg');
}

我收到以下错误;

Unable to find a file at path [image1.jpg].
Failed asserting that false is true.

我遵循了一些教程,但他们都说同样的话,我真的迷路了。

任何帮助将不胜感激。

干杯

【问题讨论】:

    标签: laravel laravel-5 phpunit


    【解决方案1】:

    问题是您正在使用md5($image . microtime()) 重命名控制器中的文件,因此您无法断言image1.jpg 存在,因为您更改了名称。

    你可以做的是让 laravel 命名文件,然后在你的测试中检查:

    在您的控制器中:

    storeAs 替换为storestore 将生成一个唯一的 ID 作为文件名。

    public function store(Request $request)
    {
        if ($request->hasFile('filename')) {
            foreach ($request->file('filename') as $image) {
                $image->store('', 'uploads');
            }
        }
    }
    

    在你的测试中:

    要断言图像是否存在,我们将使用与 laravel 保存图像时相同的方法来生成唯一 ID。在您的断言中将 'image1.jpg' 替换为 $image->hashName()

    public function testUserCanSuccessfullySubmitSingleImage(): void
    {
        Storage::fake('uploads');
    
        $this->postJson('/upload', [
            'filename' => $image = UploadedFile::fake()->image('image1.jpg')
        ]);
    
        Storage::disk('uploads')->assertExists($image->hashName());
        Storage::disk('uploads')->assertMissing('missing.jpg');
    }
    

    来自docs

    在 Web 应用程序中,最常见的存储用例之一 files 存储用户上传的文件,例如个人资料图片,照片, 和文件。 Laravel 使存储上传的文件变得非常容易 在上传的文件实例上使用 store 方法。致电商店 方法与您希望存储上传文件的路径:

    public function update(Request $request)
    {
        $path = $request->file('avatar')->store('avatars');
    
        return $path;
    }
    

    关于这个例子有一些重要的事情需要注意。注意 我们只指定了目录名,而不是文件名。默认情况下, store 方法将生成一个唯一的 ID 作为文件名。这 文件的扩展名将通过检查文件的 MIME 类型来确定。 文件的路径将由 store 方法返回,因此您可以 将路径(包括生成的文件名)存储在您的数据库中。

    【讨论】:

    • Ahhhhhhhhhh ...我怎么能错过! ... 非常感谢,我已经看了好几天了,现在想知道我哪里出错了
    • @CodeSauce 不,store 方法只会返回一个带有路径和文件名的字符串,但您可以访问UploadedFile 对象,您可以在其中检索此信息。例如$image->getSize()$image->getMimeType()
    • 对此很抱歉,但是当我将文件系统更改为 'root' => public_path('uploads') ... 似乎失败了,为什么会这样?
    • @CodeSauce 我不会将文件存储在public_path 中,您应该将它们存储在storage/app/publicstorage_path('app/public') 中,然后如果您希望它们公开,则在该目录中创建一个symlink可访问。
    • 这是个好主意,所以如果我想将我的文件存储在一个名为uploads 的目录中,我的新文件系统会是什么样子? .. 很抱歉很痛苦
    猜你喜欢
    • 2020-08-02
    • 2021-01-18
    • 1970-01-01
    • 2019-02-09
    • 2018-06-16
    • 2021-10-01
    • 2021-12-24
    • 2019-04-05
    • 2020-07-17
    相关资源
    最近更新 更多