@EVOSandru6

По какой причине в Laravel PHPUnit Future тесте в контроллере может не восприниматься Entity переменная при обновлении в роуте?

Добрый день.

Есть тест для обновления услуги:

class ServiceTest extends TestCase
{
    use WithFaker;
    use DatabaseTransactions;

    public function test_category_update_success(): void
    {
        $this->withoutMiddleware();
        $this->signInAdmin();

        $service = factory(Service::class)->create([
            'parent_id' => function () {
                return Service::find(2)->id;
            }
        ]);

        $putArr = [
            'name' => $this->faker->name,
            'parent_id' => Service::find(1)->id
        ];

        $response = $this->put(route('admin.services.update', $service), $putArr);

        throw $response->exception;

        $this->assertDatabaseHas('services', $putArr);

        $response
            ->assertStatus(302)
            ->assertRedirect(route('admin.services.show', $service))
            ->assertSessionHas('success', __('messages.success'));
    }

    protected function signInAdmin()
    {
        $user = factory(User::class, 'admin')->create();
        $this->actingAs($user);
        return $user;
    }
}


Есть определенный метод контроллера.

class ServicesController extends Controller
{
 public function update(ServiceRequest $request, Service $service)
    {
        throw new Exception(print_r([
            'Controller',
            '$service->id' => $service->id,
            '$request->all' => $request->all()
        ]));

        $service->name = $request['name'];
        $service->save();

        return redirect()->route('admin.services.show', $service)->with('success', __('messages.success'));
    }
}


Намеренно вызываю исключение в ServicesController::update, чтобы получить данные:

В варианте с тестом получаю пустой $service->id:

Array
(
[0] => Controller
[$service->id] =>
[$request->all] => Array
(
[name] => Ayden Ondricka Jr.
[parent_id] => 1
)
)


Если в режиме отправки формы из браузера, то $service->id получаю:


(
[0] => Controller
[$service->id] => 1126
[$request->all] => Array
(
[name] => Ayden Ondricka Jr.
[parent_id] => 1
)
)


Распечатка роутов:

| | GET|HEAD | admin/services | admin.services.index | App\Http\Controllers\Admin\ServicesController@index | web,auth,can:admin-panel |
| | POST | admin/services | admin.services.store | App\Http\Controllers\Admin\ServicesController@store | web,auth,can:admin-panel |
| | GET|HEAD | admin/services/create | admin.services.create | App\Http\Controllers\Admin\ServicesController@create | web,auth,can:admin-panel |
| | DELETE | admin/services/{service} | admin.services.destroy | App\Http\Controllers\Admin\ServicesController@destroy | web,auth,can:admin-panel |
| | PUT|PATCH | admin/services/{service} | admin.services.update | App\Http\Controllers\Admin\ServicesController@update | web,auth,can:admin-panel |
| | GET|HEAD | admin/services/{service} | admin.services.show | App\Http\Controllers\Admin\ServicesController@show | web,auth,can:admin-panel |
| | GET|HEAD | admin/services/{service}/edit | admin.services.edit | App\Http\Controllers\Admin\ServicesController@edit | web,auth,can:admin-panel |

Также в теле метода теста распечатывал роуты, чтобы убедиться, что формируются корректно:

throw new Exception(print_r([
     '$routeUpdate' => route('admin.services.update', $service),
     '$routeShow' => route('admin.services.show', $service)
]));


Вывод корректный:

[$routeUpdate] => localhost/admin/services/1676
[$routeShow] => localhost/admin/services/1676

Подскажите пожалуйста, почему тест стежит?
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
@EVOSandru6 Автор вопроса
$this->withoutMiddleware(VerifyCsrfToken::class);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы