如何创建带有用于测试的图像的工厂

Posted

技术标签:

【中文标题】如何创建带有用于测试的图像的工厂【英文标题】:How to create a factory with images for testing 【发布时间】:2020-10-07 06:33:45 【问题描述】:

我需要创建一个工厂来创建用于测试的图像。工厂应该创建图像并将它们保存在存储中,并且在测试后应该删除所有内容。

我该怎么做?

我现在的想法是将 字段为 null 放在工厂中,然后使用 afterCreating 方法手动保存图像,但它必须是一种更好的方法来做到这一点?

我想要实现的是:

factory(Category::class)->create();

这将生成所有图像。

$faker->图像不再起作用,因为 LoremPixel(提供者)在大多数情况下确实很慢或很慢。

【问题讨论】:

这听起来像是XY problem 的主要问题是为什么你需要创建实际图像而不是使用fake storage 【参考方案1】:

您可以使用$faker->image 生成假图片。

这是一个例子

use Faker\Generator as Faker; 
$factory->define(Product::class, function (Faker $faker) 
    return [

        'amount' => $faker->randomFloat(2, 0, 10000),
        'image' => $faker->image('public/storage/images',640,480, null, false),

    ];
);

【讨论】:

我认为 $faker->image 不再起作用了,因为 LoremPixel(提供者)在大多数时候真的很慢或很慢。【参考方案2】:

您当然可以使用 faker 创建图像进行如下测试,

<?php

use App\Category;
use Faker\Generator as Faker;

$factory->define(Category::class, function (Faker $faker) 
    return [
        'name' => $faker->word,
        'icon' => $faker->image('public/storage/test-images', 640, 480, null, false),
    ];
);

当您调用factory(\App\Category::class)-&gt;create(); 时,它将在 test-images/ 目录中创建一个具有指定尺寸的图像。

下面是image()的签名,不言自明,


@method string image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null)

唯一的事情是你需要在测试运行完成后清除test-images目录。

【讨论】:

$faker->image 不再起作用,因为 LoremPixel(提供者)在大多数情况下确实很慢或很慢。【参考方案3】:

我发现的更简洁的方法是:

    在工厂设置值为null

    $factory->define(Category::class, function (Faker $faker) 
        return [
            'img' => null,
       ];);
    

    使用 $factory->afterCreating 覆盖该值并保存 图片

    $factory->afterCreating(Category::class, function ($category, $faker) 
       $category->img = UploadedFile::fake()->image(uniqid() . '.jpg')->store('categories');
       $category->save();
    );
    

    在测试 setUp() 上创建一个假存储并在 tearDown() 上重置它

    受保护的函数 setUp(): void parent::setUp();Storage::fake('public');

    受保护的函数 tearDown(): void 存储::fake('public');

此解决方案创建用于测试的图像并删除之后的所有内容。

(对不起,代码示例,我无法正确缩进)

【讨论】:

以上是关于如何创建带有用于测试的图像的工厂的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Laravel 项目中使用自己工厂中的模型?

如何使用 azure 数据工厂下载 blob

如何为列表视图创建自定义光标适配器以用于图像和文本?

如何对具有依赖项的工厂进行单元测试

如何创建虚拟磁盘空间以避免节省硬盘?

如何在带有文本的图像上方创建透明的深色叠加层?