Как правильно написать тесты к методу контроллера в LARAVEL?

Имеется метод в контроллере :
public function sendVeryficationEmail(Request $request) {
     return  $request->input('name');
    }


как написать тест для этого метода?
Вот так не работает :
$response = $this->call('post', '/user/registerrequest',['name'=>'VasyaPupkin']);

ибо, как я понимаю чтобы вызвать тестируемый метод, как метод контроллера нужно передать ему каким-то образом объект request, которого он ожидает. Причем , в этом объекте может быть куча переменных, не однa , как приведенном упрощенном примере. Как сей объект request "замокать" - не ясно.
Разумеется, можно объявить этот метод без request , он может принимать просто строку (или массив), а вызывать его можно через другой метод, который можно не тестировать в ввиду простоты. Тогда тестирование можно будет делать без участия контроллера, что вроде бы гуд, но : Из одного метода получается ДВА, причем причина появления второго метода именно в удобстве тестирования, само приложение просто станет еще более запутанным. Это нормально или есть более элегантные решения без танцев с бубном ( у меня проблемы с хореографией)?

Спасибо.
  • Вопрос задан
  • 2566 просмотров
Решения вопроса 1
@xAockd
Вы можете просто создать инстанс контроллера и вызвать метод с передачей параметра.

$controller = new My\Controller();
$request = Request::create('/', 'GET', ['name' => 'test']);
$this->assertEquals('test', $controller->sendVeryficationEmail($request));


Как мокнуть:
$request = \Mockery::mock(Request::class);
$request->shouldReceive('input')->once()->andReturn('VasyaPupkin');
$continer->instance(Request::class, $request);
$response = $this->call('post', '/user/registerrequest');
$this->assertEquals('VasyaPupkin', $response);


Где $container это ларавельный контейнер :)

А реквест, можно либо мокнуть, либо создать.

Request::create() ну либо мок, как больше нравится.

Но, если вы хотите остаться на своем методе, вы можно подменить Request в контейнере, тем же моком.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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