Как издеваться над отношением многие ко многим в модульных тестах Laravel - PullRequest
0 голосов
/ 27 марта 2019

У меня есть следующие таблицы, пользователи, роли и role_user, которые создают отношение «многие ко многим».

В своей UserFactory при создании пользователей я назначаю им основную роль «user», например:

$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' не может быть пустым

Это правильно, потому что пользователь никогда не создается в БД, поэтому у пользователя нет идентификатора.

Как я высмеиваю пользователя / рольотношения?

1 Ответ

1 голос
/ 27 марта 2019

Вы уверены, что хотите издеваться над отношениями? Вместо этого я бы рекомендовал использовать черту DatabaseTransactions в тестовом файле и создать метод () вместо make () для вашей фабрики.

use DatabaseTransactions;

....

$user = factory(\App\User::class)->create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...