Laravel setUpBeforeClass 上的 PHPUnit 找不到工厂类

Dan*_*nes 2 phpunit laravel

我正在尝试运行一个单元测试,在测试运行之前将数据输入到数据库中。我已经定义了一个设置方法,它为我不想要的每个测试用例运行。setup 方法可以正常执行,没有问题。我想要的是将数据输入数据库一次,然后由所有测试用例使用。所以我设置了一个静态函数 setUpBeforeClass。

public static function setUpBeforeClass() : void {
    parent::setUpBeforeClass();
    static::$journalOption = new JournalOption;
    $this->user = factory(User::class)->create();


}
Run Code Online (Sandbox Code Playgroud)

当调用用户工厂类时,我收到以下错误:

InvalidArgumentException:无法找到名称为 [默认] [App\User] 的工厂

UserFactory.php 文件存在于 database/factories/UserFactory.php

<?php

use Illuminate\Support\Str;
use Faker\Generator as Faker;


$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => Str::random(10),
    ];
});
Run Code Online (Sandbox Code Playgroud)

Del*_*lan 5

factory函数在您的函数中无法正常工作setUpBeforeClass,因为在运行该函数时应用程序尚未启动。您可以引导应用程序并在您的setUpBeforeClass函数中运行迁移,但我不建议这样做。

通常,您应该为每个测试单独创建所需的数据,以防另一个测试修改或删除数据,或者有其他意外的副作用。因此,如果您将工厂保留在您的setup()功能中会更好。如果您担心污染数据库,您可以使用内存中的 SQLite 数据库进行测试。

  • 可能不言而喻,但如果我们覆盖 `setup()` 方法,我经常忘记添加 `parent::setup()` 。 (3认同)