1

我需要创建一个为测试创建图像的工厂。工厂应创建图像并将其保存在存储设备中,测试后应擦除所有内容。

我怎样才能做到这一点 ?

我现在想的是在工厂中将字段设置为null,然后使用该afterCreating方法手动保存图像,但它必须是一种更好的方法来做到这一点吗?

我想要实现的是:

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

这将生成所有图像。

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

4

3 回答 3

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),

    ];
});
于 2020-06-17T12:44:12.027 回答
1

您当然可以使用 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在测试运行完成后清除目录。

于 2020-06-17T12:49:15.903 回答
0

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

  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'); }

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

(对不起代码示例,我无法正确缩进)

于 2020-06-17T14:08:17.370 回答