1

我正在尝试为以下上传图像的 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. 如何获取 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()}");
}
4

3 回答 3

4

我在这里的源代码测试中找到了答案。解决方法就是这么简单‍♂️</p>

为组件添加一个公共属性,$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);
}
于 2020-08-22T06:57:11.857 回答
0

如果您想获取上传文件的原始名称,可以使用 getClientOriginalName 方法

所以你可以做

$this->file->getClientOriginalName()
于 2020-11-17T17:18:08.610 回答
0

这对我有用。

$validatedData = $this->validate();
$imageName = $this->image->store('public/events');
$validatedData['image'] = str_replace("public/events/", "", $imageName);
于 2021-07-04T09:53:39.457 回答