无法在 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 dumpreturnsnull:

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 - 部分 关系和属性闭包