无法在 laravel 测试中访问 eloquent 关系
Cannot access eloquent relationship in laravel test
我在User
模型和UserLevel
模型中有如下关系。
用户:
public function user_level()
{
return $this->belongsTo('App\UserLevel');
}
用户级别:
public function users()
{
return $this->hasMany('App\User');
}
这在 Tinker 中完美运行,如下所示:
但我似乎无法访问 Laravel PHPUnit 测试中的关系。以下die and dump
returnsnull
:
class AddUserTest extends TestCase
{
use DatabaseMigrations;
/** @test */
public function super_admin_can_view_add_user_form()
{
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
'user_level_id' => 7,
]);
dd($super_admin_user->user_level);
}
}
如果我 dd
$super_admin_user
,它会正确显示创建的用户。我究竟做错了什么?如何在测试中访问 user_level?
我只能假设,在您的模型工厂中您也创建了相关模型,因此如果您在测试中使用:
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
'user_level_id' => 7,
]);
这是行不通的,因为。没有 ID 为 7 的 UserLevel。因此您应该在测试中创建一个,例如:
$user_level = factory(UserLevel::class)->create();
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
'user_level_id' => $user_level->id,
]);
或从测试中完全删除 user_level_id
:
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
]);
(这是你在 tinker 中使用的)
参考:https://laravel.com/docs/5.4/database-testing#writing-factories - 部分 关系和属性闭包
我在User
模型和UserLevel
模型中有如下关系。
用户:
public function user_level()
{
return $this->belongsTo('App\UserLevel');
}
用户级别:
public function users()
{
return $this->hasMany('App\User');
}
这在 Tinker 中完美运行,如下所示:
但我似乎无法访问 Laravel PHPUnit 测试中的关系。以下die and dump
returnsnull
:
class AddUserTest extends TestCase
{
use DatabaseMigrations;
/** @test */
public function super_admin_can_view_add_user_form()
{
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
'user_level_id' => 7,
]);
dd($super_admin_user->user_level);
}
}
如果我 dd
$super_admin_user
,它会正确显示创建的用户。我究竟做错了什么?如何在测试中访问 user_level?
我只能假设,在您的模型工厂中您也创建了相关模型,因此如果您在测试中使用:
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
'user_level_id' => 7,
]);
这是行不通的,因为。没有 ID 为 7 的 UserLevel。因此您应该在测试中创建一个,例如:
$user_level = factory(UserLevel::class)->create();
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
'user_level_id' => $user_level->id,
]);
或从测试中完全删除 user_level_id
:
$super_admin_user = factory(User::class)->create([
'username' => 'Test User 6',
]);
(这是你在 tinker 中使用的)
参考:https://laravel.com/docs/5.4/database-testing#writing-factories - 部分 关系和属性闭包