Laravel Faker未知格式化程序

16

我已经尝试了一切可能的方法,但还是无法找出我做错了什么。我正在尝试使用虚拟数据来加载我的数据库,但一直收到“description”未知格式化程序的错误提示。描述是我正在使用的变量之一。

以下是我的工厂代码和种子代码。

use Faker\Generator as Faker;
use Analytics\Blockgrant;

$factory->define(Blockgrant::class, function (Faker $faker) {
    return [
        'description' => $faker->description,
        'value' => $faker->value
    ];
});

<?php

use Faker\Generator as Faker;
use Universityobfanalytics\Blockgrantcomponents;

$factory->define(Blockgrantcomponents::class, function (Faker $faker) {
    return [
        'blockgrants_id' => $faker->blockgrants_id,
        'description' => $faker->description,
        'percentage' => $faker->percentage,
        'value' => $faker->value
    ];
});

<?php

use Illuminate\Database\Seeder;
use Analytics\Blockgrant;
use Analytics\Blockgrantcomponents;

class BlockgrantSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(Blockgrant::class, 10)->create()->each(function ($blockgrant) {
            $blockgrant->blockgrantcomponents()->save(factory(Blockgrantcomponents::class)->create());

        });
    }
}

我正在使用一对一的 hasOnebelongsTo 关系

请问有人可以帮忙告诉我我做错了什么吗?


1
你确定 $faker->blockgrants_id 在库中可用吗? - Sagar Gautam
Faker有描述吗? - user3532758
请查看https://github.com/fzaninotto/Faker/以查看可用的方法。 - Sagar Gautam
1
更具体地说是格式化程序。https://github.com/fzaninotto/Faker#formatters 您可以使用$faker->sentencerealText来描述。使用randomNumber生成值和百分比等内容。 - user3532758
6个回答

61

可能是因为你在测试中使用了PHPUnit\Framework\TestCase,而不是Tests\TestCase


6
这个答案帮助我解决了自己的问题。应该标记为正确答案。 - James Hamann
1
这是正确的解决方案,谢谢。 - Stanley
1
谢谢!你的答案帮助了我! - abe
在没有 Tests\TestCase 的情况下使用 faker 是不可能的吗?例如在单元测试中。 - alvaropgl
你的解决方案解决了我的问题。谢谢! - Farzan Badakhshan

3
我正在使用Pest,在尝试编写项目中的单元测试时遇到了相同的错误,我的解决方案:

在文件tests/Pest.php中,我有一行类似于这样的代码:

uses(Tests\TestCase::class)->in('Feature');

我把它改成了这样,然后它就起作用了。
uses(Tests\TestCase::class)->in('Feature', 'Unit');

在类Test/TestCase中,记得在构造函数中调用parent::setup(),像这样:
 protected function setUp(): void
{
    try {
        parent::setUp();
    } catch (QueryException $e) {
        file_put_contents(
            getcwd() . '/testing_env_log',
            json_encode([
                'db' => Config::get('database'),
                'env' => $_ENV,
                'app' => Config::get('app'),
            ], JSON_THROW_ON_ERROR)
        );

        throw $e;
    }
    Event::fake();
}

0

解决方案1 - 如果使用测试

在测试的setUp中检查,是否调用了parent::setUp()

protected function setUp(): void
{
    parent::setUp();
    $this->setUpBannedUsersList();
}

解决方案2 尝试创建并使用新的faker:

$faker = \Faker\Factory::create();

示例

class UserFactory extends Factory
{    
    protected $model = User::class;

    public function definition(): array
    {
        //Instead of using $this->faker use new created $faker

        $faker = \Faker\Factory::create();

        return [
            'name' => $faker->name,
            'email' => $faker->unique()->safeEmail,
            'password' => Hash::make($faker->password),
        ];
    }
}

0
您需要创建自己的TestCase类,该类将使用您创建的CreatesApplication trait。
所有这些都将看起来像这样:
class TestCase extends BaseTestCase
{
    use CreatesApplication;
}

trait CreatesApplication
{
    public function createApplication(): Application
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();

        return $app;
    }
}

0
在我的情况下,我忘记在子类的setUp()函数中运行parent::setUp()函数。

0
你需要像段落一样声明“description”,就这些。希望这些信息对你有用。
        'description' => $faker->paragraph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接