[英]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.