我有以下表格,用户,角色和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。
如何模拟用户/角色关系?
答案 0 :(得分:1)
您确定要嘲笑这种关系吗? 相反,我建议您在Test文件中使用DatabaseTransactions特性,并为工厂使用create()方法而不是make()。
use DatabaseTransactions;
....
$user = factory(\App\User::class)->create();