在laravel测试中无法获得雄辩的关系

时间:2017-03-27 10:27:40

标签: php laravel laravel-5 phpunit laravel-5.4

我在User模型和UserLevel模型中有以下关系。

用户:

public function user_level()
{
    return $this->belongsTo('App\UserLevel');
}

的UserLevel:

public function users()
{
    return $this->hasMany('App\User');
}

这在Tinker中非常有效,如下所示:

enter image description here

但我似乎无法访问Laravel PHPUnit测试中的关系。以下die and dump返回null

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?

1 个答案:

答案 0 :(得分:0)

我只能假设您在模型工厂中创建了相关模型,因此如果您在测试中使用:

$super_admin_user = factory(User::class)->create([
      'username' => 'Test User 6',
      'user_level_id' => 7,
    ]);

它不起作用,因为。没有标识为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',
]);

(这是你在修补匠中使用的)

参考:https://laravel.com/docs/5.4/database-testing#writing-factories - 关系&属性闭包