laravel 如何创建一个工厂与图像进行测试

knpiaxh1  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(121)

我需要创建一个工厂,创建测试的图像。工厂应创建图像并将其保存在存储器上,测试后应删除所有内容。
我该怎么做?
我现在想的是把 * 字段放在工厂的null*,然后使用afterCreating方法手动保存图像,但它必须是一个更好的方法来做到这一点,对吗?
我想达到的是:

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

这将生成所有图像。

**$faker->image不再起作用,因为LoremPixel(提供商)在大多数情况下都很慢。

jljoyd4f

jljoyd4f1#

你可以用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目录。

oxf4rvwz

oxf4rvwz2#

您可以使用$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),

    ];
});
liwlm1x9

liwlm1x93#

我发现的最简单的方法是:
1.将工厂上的值设置为null

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

1.使用$factory->afterCreating覆盖该值并保存图像

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

1.在testsetUp()上创建一个假存储,并在tearDown()上重置它
protected function setUp():void {parent::setUp();存储::fake('public');}
protected function():void{ Storage::fake('public');}
此解决方案创建用于测试的图像,并删除之后的所有内容。
(代码示例,我不能使它缩进正确)

相关问题