使用 Storage::fake 进行测试时无法检索文件的 file_size

huf*_*404 6 testing laravel laravel-9

我刚刚将我的应用程序从 Laravel v8 升级到 v9。现在我遇到以下代码抛出此错误的问题:

League\Flysystem\UnableToRetrieveMetadata :无法检索位置为 test_file.xlsx 的文件的 file_size。

我的控制器:

<?php

namespace App\Http\Controllers\Reports;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;

class ReportDownloadController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param string $path
     * @return \Symfony\Component\HttpFoundation\StreamedResponse
     */
    public function __invoke(string $path): \Symfony\Component\HttpFoundation\StreamedResponse
    {
        return Storage::disk('temp')->download($path, request()->query('filename'));
    }
}
Run Code Online (Sandbox Code Playgroud)

相关测试:

/** @test */
    public function it_returns_a_file_download_with_the_provided_filename_presented_to_the_user()
    {
        $this->withoutExceptionHandling();

        Storage::fake('temp');
        $fakeFile = UploadedFile::fake()->create('test_file.xlsx');
        Storage::disk('temp')->put('test_file.xlsx', $fakeFile);

        $response = $this->actingAs($this->user)
            ->getJson(route('reports.download', ['path' => 'test_file.xlsx', 'filename' => 'Appropriate.xlsx']));

        $response->assertDownload('Appropriate.xlsx');
    }
Run Code Online (Sandbox Code Playgroud)

我知道 Flysystem 已更新到 v3,但我似乎不知道如何解决此问题。

我什至创建了一个空的 Laravel 9 应用程序来使用以下代码进行测试,但仍然遇到相同的错误,所以我认为这不是我的应用程序。

public function test_that_file_size_can_be_retrieved()
    {
        Storage::fake('local');
        $fakeFile = UploadedFile::fake()->create('test_file.xlsx', 10);
        Storage::disk('local')->put('test_file.xlsx', $fakeFile);

        $this->assertEquals(10, (Storage::disk('local')->size('test_file.xlsx') / 1024));
    }
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

小智 7

从 Laravel 8 切换到 Laravel 9 时,我遇到了同样的问题。

实际上抛出了Unable toretrieve the file_size错误,因为它根本无法在提供的路径中找到该文件。

就我而言,事实证明,提供给下载功能的路径以 a 开头/,这不会导致Flysystem 2出现问题,但显然会导致Flysystem 3出现问题。

鉴于您所展示的测试,它看起来并不是这里的问题,但也许这无论如何都会有所帮助。