laravel - 如何在测试中获取使用 Laravel Livewire 上传的文件的哈希名称

标签 laravel 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。如何获取 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 的公共(public)属性,以便可以在测试中访问它。

例如

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);
}

关于laravel - 如何在测试中获取使用 Laravel Livewire 上传的文件的哈希名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63501268/

相关文章:

php - Laravel LiveWire 分页问题

Laravel - 将数据传递到 Blade

mysql - 拉维尔 |唯一验证 where 子句

file - Laravel 文件上传和 File_hash 作为名称

laravel - 使用 Laravel Livewire 和 Laravel Fortify 进行登录

php - 未找到 InvalidArgumentException View [layouts.app]。 Laravel-8 LiveWire-2

javascript - 使用 VueJS 和 Laravel 应用折扣

php - 具有多层模型关系的 Laravel Eloquent 查询

php - 如何将 Laravel Livewire 与 Eloquent 模型结合使用?

laravel - Livewire 安装与渲染