Laravel Model Factories ID未设置

时间:2016-05-31 18:36:52

标签: php laravel-5 laravel-5.2

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

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

$factory->define(App\User::class, function (Faker\Generator $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),
    ];
});

我将User更改为具有整数ID作为主键,但未将其定义为自动增量。 因此工厂为ID创建随机数。

我也创建了简单的测试:

public function test_id_is_visible() {
    $user = factory(App\User::class)->create();

    $this->actingAs($user);
    $this->visit('/userprofile');
    $this->see($user->id);
}

该测试总是失败,但是当我手动导航到页面时似乎没问题。

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

如何获取ID的正确值?

修改 现在我看到,如果我将$user = factory(App\User::class)->create();更改为$user = factory(App\User::class)->make();,则用户实例会保留正确的ID。但为什么要创建清除ID?

3 个答案:

答案 0 :(得分:3)

针对Laravel 5.8+的更新,请确保设置

public $incrementing = false;

在您的模型上。

答案 1 :(得分:1)

问题出现是因为ID未定义为自动增量 您可以在以下位置找到更多信息:
https://stackoverflow.com/a/31350800/1725836

即使问题是Laravel 4,它仍然适用于Laravel 5.2。

答案 2 :(得分:0)

您可以这样编写测试:

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

现在每个用户将拥有一个idwithout the need to persist the models to database(使用create()而不是make())。

public function test_id_is_visible() {
    $user = factory(App\User::class)->make();
    $user->id = 7;

    $this->actingAs($user);
    $this->visit('/userprofile');
    $this->see($user->id);
}