如何创建带有用于测试的图像的工厂
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)->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');
此解决方案创建用于测试的图像并删除之后的所有内容。
(对不起,代码示例,我无法正确缩进)
【讨论】:
以上是关于如何创建带有用于测试的图像的工厂的主要内容,如果未能解决你的问题,请参考以下文章