【发布时间】:2019-03-27 20:32:46
【问题描述】:
我有以下创建多对多关系的表、用户、角色和角色用户。
在我的 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。
如何模拟用户/角色关系?
【问题讨论】:
-
您可以发布您的
User模型吗?您是否将roles定义为belongsToMany关系?如果是这样,它应该寻找像role_user_role_id_foreign这样的外键
标签: laravel unit-testing laravel-5 eloquent