За последние 24 часа нас посетили 22504 программиста и 1033 робота. Сейчас ищут 652 программиста ...

Как правильно создать test для сводной таблицы?

Тема в разделе "Laravel", создана пользователем Drummer, 27 апр 2021.

Метки:
  1. Drummer

    Drummer Активный пользователь

    С нами с:
    30 май 2020
    Сообщения:
    9
    Симпатии:
    1
    Добрый день. Я хочу создать тест для контроллера. Есть три таблицы, roles, categories и categories_roles, связь многие ко многим.

    Контроллер:
    PHP:
    1.     /**
    2.      * Update connections.
    3.      *
    4.      * @return \Illuminate\Contracts\Support\Renderable
    5.      */
    6.     public function update(Request $request) {
    7.  
    8.         $input = $request->get('category', []);
    9.         foreach (Category::all() as $category) {
    10.             $category->roles()->sync(Arr::get($input, $category->id, []));
    11.         }
    12.         return view('home');
    13.     }
    Не могу сообразить как написать тест, в голове предстовление есть а вот как реализовать не знаю. Как я начал пока делать.

    Test

    PHP:
    1.     /** @test */
    2.     public function test_admin_user_can_edit_categories_roles()
    3.     {
    4.         $this->actingAs(\App\Models\User::factory()->create(['role_id' => 1]));
    5.         $input = [
    6.             "1" => [
    7.                 "1" => "1"
    8.             ],
    9.             "2" => [
    10.                 "1" => "1"
    11.             ],
    12.         ];
    13.         $this->post('/admin/connections', $input);
    14.     }
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Если коротко, то не имея понятия что тестировать, не надо выдавливать из себя хоть что-нибудь.
    Сначала должна появиться цель тестирования, возможно даже раньше, чем написан код. Словами напиши что именно проверяется, потом думай как в этом убедиться.
    --- Добавлено ---
    П.С. Лично мне непонятно что этот код делает.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.552
    Симпатии:
    1.754
    @Drummer и post-запросы не должны возвращать вьюху, они должны редирект делать
     
  4. Drummer

    Drummer Активный пользователь

    С нами с:
    30 май 2020
    Сообщения:
    9
    Симпатии:
    1
    Я планирую заниматься рефакторингом, а также я занимаюсь изучением laravel. У меня есть форма в которой есть связи Ролей и Категорий.[​IMG]


    Есть таблица в базе с роляими и категориями, а также связывающая таблица. Role (id, name), Categories (id title), Roles_categories (roles_id, categories_id).
    [​IMG]
    [​IMG]
    [​IMG]

    Форма при заполнении передает двумерный массив с теми данными которые надо изменить в базе, этим занят контроллер с методом sync(). На входе он получает массив и создает связи в таблице. Мне нужно создать тест для этого контроллера.

    Я создал вот такой тест, но это не то что мне нужно, он не тестирует контролллер.
    PHP:
    1. /** @test */
    2.     public function test_admin_user_can_edit_categories_roles()
    3.     {
    4.         $this->actingAs(\App\Models\User::factory()->create(['role_id' => 1]));
    5.  
    6.         $category = \App\Models\Category::factory()->create();
    7.         $role = \App\Models\Role::factory()->create();
    8.         $category->roles()->sync($role);
    9.  
    10.         $this->assertDatabaseHas('categories_roles', [
    11.             'categories_id' => $category->id,
    12.             'roles_id' => $role->id
    13.         ]);
    14.     }