Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 03.08.2018 16:10:27

Тестирование: как проверить значения переменных в методе контроллера

Впервые имею дело с юнит-тестами; основную документацию уже прочитал, тем не менее пока не понятно как сделать какие-то элементарные вещи. В этом простом с точки зрения логики тесте я бы хотел проверить, записались ли значения utm-параметров в соответствующие поля класса.

PHP
class TopPageController extends Controller {
  public function 
render(): void {
     
$this->utm_source request()->utm_source;
     
$this->utm_term request()->utm_term;
  }
}
PHP
class ExampleTest extends TestCase {

  public function 
exampleTest() {
    
$response $this->get('/?utm_source=google&utm_term=keyword1%20keyword2');
    
$this->assertTrue(/* В TopPageController->render() все значения переменных не пустые? */);
  }
}

С точки зрения PHP это нереалезуемо: в общем случае поля $this->utm_source и $this->utm_term не обязаны быть открытыми, потому в методе exampleTest() доступа к ним быть не должно. Тем не менее, эта проблема должна быть как-то решена в юнит-тестировании.

Изменено Gleb2708 (03.08.2018 16:15:02)

Не в сети

#2 03.08.2018 17:36:20

Re: Тестирование: как проверить значения переменных в методе контроллера

Ты придумал плохой тест.

Это никак не протестируешь (если не мокать магические методы).

Можно сделать установку значений через setUtmSource() и setUtmTerm() методы и замокать контроллер TopPageController. Но и это проблемотично, насколько знаю, laravel не пользволяет из коробки мокать контроллеры. Придется с роутами играться.

В идеале - контроллер обращается как-то к IoC (будь это фасад, прямое обращение app или DI) и достает оттуда некий класс, сеттер меток.
В тесте ты мочишь этот класс (мочишь вызов методов setUtmSource и setUtmTerm, сравниваешь ожидаемые аргументы и реальные) и этот мок кладешь в IoC.

Кстати, ты юзаешь $response = $this->get('/?utm_source=google&utm_term=keyword1%20keyword2'); - это уже не unit тест.

P.S. Научится писать тестируемый код должен каждый разработчик.

Изменено covobo (03.08.2018 17:43:54)

Не в сети

#3 04.08.2018 17:07:44

Re: Тестирование: как проверить значения переменных в методе контроллера

С точки зрения PHP это нереалезуемо: в общем случае поля $this->utm_source и $this->utm_term не обязаны быть открытыми, потому в методе exampleTest() доступа к ним быть не должно.

PHPUnit позволяет тестировать поля вне зависимости от области видимости с помощью функций вида assertAttribute..., например: assertAttributeSame('somestr', 'strProp', $obj);

Степень кошерности сего подхода может быть разной в зависимости от ситуации и может быть вполне приемлемой, если все остальные способы протестировать нечто ведут к велосипедам и усложнению тестов и/или тестируемого кода (класса).

Не в сети

#4 05.08.2018 14:42:57

Re: Тестирование: как проверить значения переменных в методе контроллера

PHPUnit позволяет тестировать поля вне зависимости от области видимости с помощью функций вида assertAttribute..., например: assertAttributeSame('somestr', 'strProp', $obj);

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

Не в сети

Подвал раздела