未设置拉拉维尔模型工厂 ID



我有一个常规的User模型。当我使用它时,系统工作正常。但是现在我正在尝试在与Laravel集成的PHPUnit中创建单元测试。

我有一个创建用户的工厂:

$factory->define(AppUser::class, function (FakerGenerator $faker) {
    return [
        'id' => $faker->randomNumber(9),
        'email' => $faker->safeEmail,
        'first_name' => $faker->firstNameMale,
        'last_name' => $faker->lastName,
        'password' => bcrypt(str_random(10)),
        'remember_token' => str_random(10),
    ];
});

我将用户更改为将整数 ID 作为主键,但它未定义为自动递增。因此,工厂为 ID 创建随机数。

我还创建了简单的测试:

public function test_id_is_visible() {
    $user = factory(AppUser::class)->create();
    $this->actingAs($user);
    $this->visit('/userprofile');
    $this->see($user->id);
}

该测试总是失败,但是当我手动导航到该页面时似乎还可以。

我注意到在测试中$user->id始终为 0。即使在工厂也不能是0。我检查并 Laravel将用户正确插入数据库,它具有正确的ID,但在代码中我总是得到0。

如何获取正确的 ID 值?

编辑现在我看到,如果我将$user = factory(AppUser::class)->create();更改为$user = factory(AppUser::class)->make();用户实例持有正确的 ID。但是为什么要创建会清除 ID?

Laravel 5.8+ 的更新 确保设置

public $incrementing = false;

在您的模型上。

出现问题是因为 ID 未定义为自动增量。
更多信息,请参阅:
https://stackoverflow.com/a/31350800/1725836

甚至问题是对于 Laravel 4 它仍然与 Laravel 5.2 相关。

你可以像这样编写测试:

$users = factory(User::class, 5)->make();
$users->each(function ($item, $key) {
    $item->id = ++$key;
});

现在每个用户都将有一个id,而无需将模型持久化到数据库(使用create()而不是make())。

public function test_id_is_visible() {
    $user = factory(AppUser::class)->make();
    $user->id = 7;
    $this->actingAs($user);
    $this->visit('/userprofile');
    $this->see($user->id);
}

最新更新