繁体   English   中英

Laravel S3文件上传测试错误

[英]Laravel S3 file upload test errors

我正在尝试编写一个测试来模拟生成预签名 url 的 S3 上传。

这是我的测试:

    public function test_it_uploads_to_s3()
    {
        Storage::fake('s3');

        $response = $this->json('POST', route('api.presignedUpload', 1), [
            'name' => 'file.txt',
        ]);

        $response->assertStatus(200)
            ->assertJsonStructure(['url']);
    }

我收到以下错误: Call to undefined method League\Flysystem\Adapter\Local::getClient()

我以为我只需要添加Storage::fake('s3'); 部分,它应该模拟 S3 还是我弄错了?

编辑: controller function 代码:

 $s3 = Storage::disk('s3');
 $client = $s3->getDriver()->getAdapter()->getClient();

 $cmd = $client->getCommand('PutObject', [
     'Bucket' => \Config::get('s3.bucket'),
     'Key' => 'files/' . $request->name,
     'ACL' => 'private',
 ]);

 $request = $client->createPresignedRequest($cmd, $this->expiry);

 $presignedUrl = (string)$request->getUri();

 return response()->json(['url' => $presignedUrl], 201);

我不确定您仅在此上下文中遇到的错误,但根据Laravel 8.x 文档,您似乎缺少一些代码:

public function test_it_uploads_to_s3() {

    Storage::fake('s3');

    $response = $this->json('POST', route('api.presignedUpload', 1), [
        UploadedFile::fake()->file('file.txt')
    ]);

    Storage::disk('s3')->assertExists('file.txt');

    $response->assertStatus(200)->assertJsonStructure(['url']);

}

您可以模拟文件系统并对其进行测试。

use Illuminate\Support\Facades\Storage;
use Mockery;

protected static function mockPresignedUrl()
{
    $storage = Mockery::mock('League\Flysystem\Adapter\Local');

    $storage->shouldReceive('getAdapter')->andReturn($storage)
        ->shouldReceive('getClient')->andReturn($storage)
        ->shouldReceive('getBucket')->andReturn('s3')
        ->shouldReceive('getCommand')->andReturn($storage)
        ->shouldReceive('createPresignedRequest')->andReturn($storage)
        ->shouldReceive('getUri')->andReturn('https://some-presigned-url');

    return $storage;
}


public function test_it_uploads_to_s3()
{
    $storage = $this->mockPresignedUrl();
    
    Storage::set('s3', $storage);

    $this->putJson(route('api.presignedUpload', 1), [
            'name' => 'file.txt',
        ])
        ->assertStatus(200)
        ->assertJson([
            'url' => 'https://some-presigned-url'
        ]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM