Я пытаюсь протестировать функцию, которая зависит от
$request->all();
в методе. Как издеваться над классом Request, чтобы $request->all(); возвращался
['includes' => ['some_val','another_val']
в тестах?
Это должен быть принятый ответ.






Рекомендую использовать 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 позволит имитирующему классу использовать имитацию метода (аргумент shouldReceive), поэтому мы имитируем метод all и возвращаем желаемое значение, в данном случае массив, который вы опубликовали.Как заявил @devk, Laravel не рекомендует имитировать класс Request, поэтому не делайте этого, но если вам нужно имитировать любой другой объект, вы можете использовать код выше, и он будет работать отлично.
Как заявил devk, не высмеивайте запрос. Но Laravel позволяет вам создать фактический запрос, а затем вызвать ваш контроллер в вашем тесте следующим образом:
public function testPostRequest() {
$response = $this->post(
'/my-custom-route',
['includes' => ['some_val','another_val']
);
}
Это возможное решение, потому что, возможно, он хочет просто провести модульный тест, а вы делаете тест функции.
По https://stackoverflow.com/a/61903688/135114, если
$request,... тогда вам не нужно "высмеивать" Запрос (например, издевательство),
вы можете просто создать Request и передать его, например
public function test_myFunc_condition_expectedResult() {
...
$mockRequest = Request::create('/path/that/I_want', 'GET');
$this->assertTrue($myClass->myFuncThat($mockRequest));
}