Тестирование Laravel. Сброс контроллера DI во время теста - PullRequest
0 голосов
/ 25 января 2019

У меня есть контроллер Laravel с DI в

__construct(Model1 $m1, Model2 $m2, $SomeService $s) {
 $this->m1 = $m1;
 $this->m2 = $m2;
 $this->s = $s;
}

У меня есть тест API с вызовом или конечной точкой на основе этого контроллера. Я делаю 8 одинаковых URL-вызовов API с различной полезной нагрузкой. Кажется, z конструктор контроллера обрабатывает 1 раз и после этого работает с построенными зависимостями.

$response1 = $this->actingAs($admin,'api')->json('POST', '/api/someURL', $payload1);

$response2 = $this->actingAs($admin,'api')->json('POST', '/api/someURL', $payload2);

$responseN = $this->actingAs($admin,'api')->json('POST', '/api/someURL', $payloadN);

Можно ли как-то установить зависимости перед каждым вызовом API в тесте?

1 Ответ

0 голосов
/ 25 января 2019

Вы можете сбросить экземпляр контроллера между запросами от маршрута, используя:

$response1 = $this->actingAs($admin,'api')->json('POST', '/api/someURL', $payload1);

// unset the controller
$this->app->get(Illuminate\Routing\Route::class)->controller = null;

$response2 = $this->actingAs($admin,'api')->json('POST', '/api/someURL', $payload2);

// unset the controller
$this->app->get(Illuminate\Routing\Route::class)->controller = null;

$responseN = $this->actingAs($admin,'api')->json('POST', '/api/someURL', $payloadN);

Почему?

В Подсветка \ Маршрутизация \ Маршрутизатор Laravel привязывает текущий маршрут к контейнеру:

protected function findRoute($request)
{
    $this->current = $route = $this->routes->match($request);
    $this->container->instance(Route::class, $route);
    return $route;
}

и когда контроллер маршрута запускается в Подсветка \ Маршрутизация \ Маршрут , экземпляр контроллера сохраняется в объекте Маршрут:

public function getController()
{
    if (! $this->controller) {
        $class = $this->parseControllerCallback()[0];
        $this->controller = $this->container->make(ltrim($class, '\\'));
    }
    return $this->controller;
}
...