Как издеваться над классом запроса в Laravel?

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

$request->all();

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

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

в тестах?

Не надо (см. Сообщение внизу).
DevK 16.05.2018 17:59

Это должен быть принятый ответ.

Fredrik 18.10.2018 11:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
3
2
4 356
3

Ответы 3

Рекомендую использовать 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'] 
    );
}

Это возможное решение, потому что, возможно, он хочет просто провести модульный тест, а вы делаете тест функции.

matiaslauriti 17.05.2018 07:14

По https://stackoverflow.com/a/61903688/135114, если

  1. ваша тестируемая функция принимает аргумент $request,
  2. вам не нужно делать забавные вещи с запросом - вам достаточно реальных путей

... тогда вам не нужно "высмеивать" Запрос (например, издевательство),
вы можете просто создать Request и передать его, например

public function test_myFunc_condition_expectedResult() {
    ...
    $mockRequest = Request::create('/path/that/I_want', 'GET'); 
    $this->assertTrue($myClass->myFuncThat($mockRequest));
}

Другие вопросы по теме