Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Впервые имею дело с юнит-тестами; основную документацию уже прочитал, тем не менее пока не понятно как сделать какие-то элементарные вещи. В этом простом с точки зрения логики тесте я бы хотел проверить, записались ли значения utm-параметров в соответствующие поля класса.
class TopPageController extends Controller {
public function render(): void {
$this->utm_source = request()->utm_source;
$this->utm_term = request()->utm_term;
}
}
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)
Не в сети
Ты придумал плохой тест.
Это никак не протестируешь (если не мокать магические методы).
Можно сделать установку значений через 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)
Не в сети
С точки зрения PHP это нереалезуемо: в общем случае поля $this->utm_source и $this->utm_term не обязаны быть открытыми, потому в методе exampleTest() доступа к ним быть не должно.
PHPUnit позволяет тестировать поля вне зависимости от области видимости с помощью функций вида assertAttribute..., например: assertAttributeSame('somestr', 'strProp', $obj);
Степень кошерности сего подхода может быть разной в зависимости от ситуации и может быть вполне приемлемой, если все остальные способы протестировать нечто ведут к велосипедам и усложнению тестов и/или тестируемого кода (класса).
Не в сети
PHPUnit позволяет тестировать поля вне зависимости от области видимости с помощью функций вида assertAttribute..., например: assertAttributeSame('somestr', 'strProp', $obj);
А контроллер, без велосипедов, замокать можно?
Не в сети