如何创建带有图像的工厂以进行测试

How to create a factory with images for testing

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

我该怎么做?

我现在想的是把factory上的字段设置为null然后用afterCreating方法手动保存图片,但是必须有更好的方法吗?

我想要实现的是:

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

这将生成所有图像。

$faker->image 不再工作,因为 LoremPixel(提供者)在大多数时候真的很慢或变慢。

您可以使用 $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 创建图像进行测试,如下所示,

<?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)->create(); 时,它将在 test-images/ 目录中创建具有指定尺寸的图像。

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


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

唯一的问题是,一旦测试 运行 完成,您需要清除 test-images 目录。

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

  1. 在出厂时将值设置为 null

    $factory->define(Category::class, function (Faker $faker) {
        return [
            'img' => null,
       ];});
    
  2. 使用$factory->afterCreating覆盖值并保存 图片

    $factory->afterCreating(Category::class, function ($category, $faker) {
       $category->img = UploadedFile::fake()->image(uniqid() . '.jpg')->store('categories');
       $category->save();
    });
    
  3. 在测试 setUp() 上创建一个假存储并在 tearDown() 上重置它

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

    受保护的函数 tearDown(): void{ Storage::fake('public'); }

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

(抱歉代码示例,我无法正确缩进)