PHPUnit-тестирование с анонимными функциями - PullRequest
0 голосов
/ 02 сентября 2018

Скажем, я использую фреймворк, такой как Slim (PHP), и у меня есть довольно современная структура кода:

$app->post("/", function($request, $response) {

    // define the post actions here

});

Я мог бы поместить анонимную функцию в отдельный класс, но есть ли способ написать тест без потери этой структуры кода?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Если вы хотите протестировать именно эту анонимную функцию, вы можете попробовать смоделировать переменную $app:

$app = $this->getMockBuilder('app class')->disableOriginalConstructor()
    ->setMethods(['post'])
    ->getMock();
$app->method('post')->willReturnCallback(function ($url, $anonymousFunction) {
    // do some tests with $anonymousFunction
});
0 голосов
/ 02 сентября 2018

Есть несколько способов проверить это. В любом случае, я бы порекомендовал разбить каждый обработчик на отдельный файл (возможно, даже класс, у которого есть метод __invoke). Причина в том, что теперь этот способ определения обработчиков выглядит коротким и четким. Но как только у вас есть более 10 конечных точек, становится очень некрасиво поддерживать и вы смешиваете логику маршрутизации с разными обработчиками.

Если это очень маленький проект, и вы хотите сохранить такой синтаксис, есть две стратегии для его проверки. Но имейте в виду, что оба они будут немного более громоздкими, чем вы могли бы:

Стиль тестирования интеграции (НЕ рекомендуется)

вы просто вызываете $slim->run() в своих тестах и ​​проверяете, соответствует ли вывод обработчика вашим ожиданиям. Slim предлагает хороший способ смоделировать запрос http , который вы можете найти внизу этой страницы . Обратите внимание, что вы будете ограничены проверкой только тех данных, которые возвращены вашим обработчиком. Если ваш обработчик возвращает простой HTML, вы можете только проверить, что возвращенный HTML содержит правильные вещи.

Вы могли бы пойти немного дальше, если бы вы использовали функцию инжекции зависимостей в slim и предоставили им макеты.

Простой стиль обработчика (рекомендуется)

В качестве альтернативы вы также можете сохранить свою анонимную функцию-обработчик в маршрутизации, но отложить обработку фактической бизнес-логики до другого класса, который вы затем сможете протестировать. Если ваш контроллер очень прост и ничего не делает, кроме как извлекает параметры GET / POST и передает их в класс, тогда тестирование не так уж и много.

Помимо того, что это дает вам возможность проверить, это также более хороший способ думать о разделении проблем. Ваша тонкая функция обработчика позаботится о фреймворке и основах HTTP, и у вас будет хороший класс домена, который не нужно беспокоиться об этом.

$app->post("/register", function() {
    $result = (new RegisterUserAction())
        ->register($_POST["email"], $_POST["password1"], $_POST["password2"]); 
    // now use $result to render the html page to show to the user
});
...