如何创建带有图像的工厂以进行测试
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
目录。
我发现的更简洁的方法是:
在出厂时将值设置为 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');
}
此解决方案创建用于测试的图像并删除它之后的所有内容。
(抱歉代码示例,我无法正确缩进)
我需要创建一个工厂来创建用于测试的图像。工厂应该创建图像并将它们保存在存储中,并且在测试之后应该删除所有内容。
我该怎么做?
我现在想的是把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
目录。
我发现的更简洁的方法是:
在出厂时将值设置为 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'); }
此解决方案创建用于测试的图像并删除它之后的所有内容。
(抱歉代码示例,我无法正确缩进)