Laravel 7 模型工厂为 faker 抛出“InvalidArgumentException: Unknown formatter”异常

Posted

技术标签:

【中文标题】Laravel 7 模型工厂为 faker 抛出“InvalidArgumentException: Unknown formatter”异常【英文标题】:Laravel 7 model factory is throwing "InvalidArgumentException: Unknown formatter" exception for faker 【发布时间】:2021-01-25 22:47:03 【问题描述】:

我开始使用 Laravel 8 构建一个 Web 应用程序。我注意到 Laravel 8 中发生了一些变化,包括模型工厂。现在,我正在为模型编写一个使用工厂的单元测试。但是当我使用 faker 伪造字段时它会抛出错误。

这是我的测试方法。

public function testHasRoleReturnsTrue()

    $user = User::factory()->create();

如您所见,我现在要做的就是尝试使用工厂创建用户。这是我的用户模型工厂类。

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Str;

class UserFactory extends Factory

    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    

如您所见,我正在使用 faker 来伪造值。当我运行测试时,出现以下错误。

InvalidArgumentException: Unknown formatter "name"

/var/www/vendor/fzaninotto/faker/src/Faker/Generator.php:248
/var/www/vendor/fzaninotto/faker/src/Faker/Generator.php:228
/var/www/vendor/fzaninotto/faker/src/Faker/Generator.php:274
/var/www/database/factories/UserFactory.php:28
/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:366
/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:345
/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:329
/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php:157
/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:334
/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:302
/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:228

我认为错误是因为我使用了faker。但我无法在代码中发现任何问题。我的代码有什么问题,我该如何解决?

【问题讨论】:

这是单元测试吗?? 是的。这是单元测试。 【参考方案1】:

这是因为您在单元测试中使用它。它正在扩展 PhpUnit 的 TestCase。

当你扩展 Laravel 的 TestCase 时,它​​应该可以工作。

【讨论】:

谢谢。这就是问题所在。干杯。 如果有人在使用 PHPStorm,您还可以从 Settings &gt; Editor &gt; File and Code Templates 更新“PHPUnit 6 测试”模板。只需更正TestCase 导入即可使用Tests\TestCase laravel.com/docs/8.x/testing 他们实际上使用use PHPUnit\Framework\TestCase; 来扩展他们的测试类... 但这就是为什么你不能在单元测试中使用 Faker,也许是故意的。 好吧,目前我正在扩展启动 Laravel 应用程序的 TestCase,但它仍在抱怨未知的格式化程序。 Composer 依赖项已更新,在修补程序工厂中按预期工作。在这一点上,我实际上没有任何线索。

以上是关于Laravel 7 模型工厂为 faker 抛出“InvalidArgumentException: Unknown formatter”异常的主要内容,如果未能解决你的问题,请参考以下文章

InvalidArgumentException:无法找到名称为 [default] 的工厂 - laravel、faker、phpunit

是否可以在 Laravel 项目中使用自己工厂中的模型?

laravel5中使用faker生成模拟数据

如何为 Laravel 工厂使用自定义值列表,维护订单并仍在使用 Faker 外观?

用于手机号码的控制器未知格式的 Laravel faker

工厂的增量编号,Laravel