如何在Laravel单元测试中模拟多对多关系

时间:2019-03-27 10:43:06

标签: laravel unit-testing laravel-5 eloquent

我有以下表格,用户,角色和role_user,它们创建了多对多关系。

在我的UserFactory中,创建用户时,我为他们分配了“用户”的基本角色,如下所示:

$factory->afterCreating(User::class, function ($user, $faker){
    $roles = Role::where('name', 'user')->get();
    $user->roles()->sync($roles->pluck('id')->toArray());
});

然后在我的单元测试中,我可以为用户测试尝试访问管理页面时是否重定向了302:

$this->actingAs(factory(\App\User::class)->make());

$request = Request::create('/admin', 'GET');

$middleware = new AccessAdmin;
$response = $middleware->handle($request, function () {});

$this->assertEquals($response->getStatusCode(), 302);

这可以按预期工作,但是问题是,我不确定如何模拟关系数据,因此正在与管理员用户测试相反的情况。我尝试过创建用户,然后像这样附加角色:

$user = factory(\App\User::class)->make();
$roles = Role::where('name', 'admin')->get();
$user->roles()->sync($roles->pluck('id')->toArray());

这给了我以下错误:

  

PDOException:SQLSTATE [23000]:违反完整性约束:1048   列“ user_id”不能为空

这是正确的,因为从未在数据库中创建用户,因此用户没有ID。

如何模拟用户/角色关系?

1 个答案:

答案 0 :(得分:1)

您确定要嘲笑这种关系吗? 相反,我建议您在Test文件中使用DatabaseTransactions特性,并为工厂使用create()方法而不是make()。

use DatabaseTransactions;

....

$user = factory(\App\User::class)->create();