如何解决如何在测试中获取使用Laravel Livewire上传的文件的哈希名称
我正在尝试为以下用于上传图像的Livewire组件编写测试:
use Livewire\Component;
use Livewire\WithFileUploads;
class UploadImage extends Component
{
use WithFileUploads;
public $image;
public function save()
{
$this->validate([
'image' => 'image|mimes:jpg,jpeg',]);
$storedImage = $this->image->store('images'); // returns e.g. "images/PznpCCFUUDjZuZRDEAGpsr7SxV2qIM2dEsZ3l0zO.jpeg"
// save $storedImage as the name in the images table
}
}
下面的测试失败,因为文件是使用哈希名而不是test.jpg
保存到磁盘和db的。如何获得Livewire为测试中的图像创建的哈希名称?
组件中的$storedImage
与测试中的$image->hashName()
不同
/** @test **/
function it_can_upload_an_image() {
Storage::fake();
$image = UploadedFile::fake()->image('test.jpeg');
Livewire::test(UploadImage::class)
->set('image',$image)
->call('save');
$this->assertDatabaseHas('images',[
'name' => "images/{$image->hashName()}",]);
Storage::assertExists("images/{$image->hashName()}");
}
解决方法
我在源代码的测试here中找到了答案。解决方案非常简单?♂️
为$storedImage
的组件添加一个公共属性,以便可以在测试中对其进行访问。
例如
use Livewire\Component;
use Livewire\WithFileUploads;
class UploadImage extends Component
{
use WithFileUploads;
public $image;
public $storedImage;
public function save()
{
$this->validate([
'image' => 'image|mimes:jpg,jpeg',]);
$this->storedImage = $this->image->store('images');
// save $storedImage as the name in the images table
}
}
现在可以从测试中访问散列名称,例如:
/** @test **/
function it_can_upload_an_image() {
Storage::fake();
$image = UploadedFile::fake()->image('test.jpeg');
$storedImage = Livewire::test(UploadImage::class)
->set('image',$image)
->call('save')
->get('storedImage');
$this->assertDatabaseHas('images',[
'name' => $storedImage,]);
Storage::assertExists($storedImage);
}
,
如果您想获取上传文件的原始名称,则可以使用getClientOriginalName方法获取
所以你可以做
$this->file->getClientOriginalName()
,
这对我有用。
$validatedData = $this->validate();
$imageName = $this->image->store('public/events');
$validatedData['image'] = str_replace("public/events/","",$imageName);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。