Как издеваться над классом запроса в Laravel? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь проверить функцию, которая зависит от

$request->all();

в методе. Как мне издеваться над классом запроса, чтобы $request->all(); вернул

['includes' => ['some_val','another_val'] 

в тестах?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Как утверждает devk, не издевайтесь над запросом.Но Laravel позволяет вам создать реальный запрос и затем вызвать ваш контроллер в вашем тесте так:

public function testPostRequest() {
    $response = $this->post(
        '/my-custom-route',
        ['includes' => ['some_val','another_val'] 
    );
}
0 голосов
/ 16 мая 2018

Я рекомендую вам использовать mockery/mockery.

Я не помню сейчас, если Laravel идет с ним или нет (я думаю, да).

В любом случае вам придется сделать следующее:

В тесте вашего метода выполните:

app()->bind(\Illuminate\Http\Request::class, function () {
    $mock = \Mockery::mock(\Illuminate\Http\Request::class)->makePartial();
    $mock->shouldReceive('all')->andReturn(['includes' => ['some_val','another_val']]);

    return $mock;
});

Что вы там делаете:

  • Привязка макетак запросу, поэтому, когда вы выполните yourMethod(Request $request), он будет создавать экземпляр вашего макета вместо реального класса.
  • Выполнение \Mockery::mock(CLASS)->makePartial(); сначала создаст макет этого класса, а затем (makePartial()) позволитчтобы вы могли использовать другие немодулированные методы, чтобы их можно было использовать (используйте реальные методы), поэтому любой метод, который вы не смоделировали, будет запускать реальный код.
  • shouldReceive позволит смоделированному классу использовать mock метод (аргумент)из shouldReceive), поэтому мы смоделируем all метод и возвращаем желаемое значение, в данном случае - массив, который вы разместили.
  • И, наконец, мы должны вернуть макет как экземпляр.

Как сказал @devk, Laravel не рекомендует насмехаться над классом Request, так что не делайте этого, но если вам нужноk любой другой объект, вы можете использовать приведенный выше код, и он будет отлично работать.

...