我需要创建一个为测试创建图像的工厂。工厂应创建图像并将其保存在存储设备中,测试后应擦除所有内容。
我怎样才能做到这一点 ?
我现在想的是在工厂中将字段设置为null,然后使用该afterCreating方法手动保存图像,但它必须是一种更好的方法来做到这一点吗?
我想要实现的是:
factory(Category::class)->create();
这将生成所有图像。
$faker->image 不再起作用,因为 LoremPixel (提供者)在大多数情况下确实很慢或很慢。
我需要创建一个为测试创建图像的工厂。工厂应创建图像并将其保存在存储设备中,测试后应擦除所有内容。
我怎样才能做到这一点 ?
我现在想的是在工厂中将字段设置为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),
];
});
当您调用它时,它将在test-images/factory(\App\Category::class)->create();目录中创建一个具有指定尺寸的图像。
下面是 的签名image(),不言自明,
@method string image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null)
唯一的事情是您需要test-images在测试运行完成后清除目录。
我发现的更清洁的方法是:
在工厂中将值设置为 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{ Storage::fake('public'); }
此解决方案创建用于测试的图像并删除之后的所有内容。
(对不起代码示例,我无法正确缩进)