Slim — вызов конечной точки из браузера работает нормально, а вызов конечной точки из PHPUnit Test возвращает 404

Я следую настройке тестирования для Slim с PHPUnit @ http://there4development.com/blog/2013/10/13/unit-testing-slim-framework-applications-with-phpunit/

Изначально у меня была вся моя логика в анонимной функции

$app->get('/video/', function () use ($app) {
    // all code goes here
}

и тестирование через PHPUnit работало отлично...

public function testVideoCountInPage1() {
    $this->get('/video/');
    $this->assertEquals(200, $this->response->status());

    $rawResponse                =   $this->response->body();
    $jsonResponse               =   json_decode($rawResponse);

    $this->assertSame(20, count($jsonResponse->data));
}

Но теперь я разделил основную логику в `get('/video/') на несколько функций, например:

$app->get('/video/', function () use ($app) {
    // some logic

    $db                             =   openDB($dbConfig);
    $page                           =   findPageParameter($app->request()->params());

    // some logic
}

function openDB($dbConfig) {
    // open DB here
    return                              $db;
}

function findPageParameter($params) {
    // find page here
    return                              (int)$page;
}

Тем не менее я получаю правильный ответ для вызова конечной точки /video. Но модульные тесты терпят неудачу, говоря

.PHP Fatal error: Cannot redeclare openDB() (previously declared in /var/www/traffic/app/routes/video.php:69) in /var/www/traffic/app/routes/video.php on line 75

Обновление: эта ошибка была исправлена, как только я заменил пару require на require_once. Но теперь утверждения в тестах не говорят

1) videoTest::testVideoCountInPage1
Failed asserting that 404 matches expected 200.

когда я вызываю ту же конечную точку http://localhost/traffic/index.php/video, я получаю статус 200 с правильными результатами. Когда PHPUnit вызывает ту же конечную точку, он возвращает 404.

Обновление 2: модульные тесты, в которых я тестирую отдельные функции openDB() и findPageParameter(), работают нормально. Только окончательное тестирование API SLIM REST завершается с ошибкой 404...

Ссылка:


person saiy2k    schedule 22.07.2014    source источник
comment
Вы пытаетесь объявить функцию более одного раза, например. из-за мульти-включая файл. Если это так, используйте require/include_once вместо require/include.   -  person pavel    schedule 22.07.2014
comment
Вы уверены, что ваш код выглядит именно так? В сообщениях об ошибках, похоже, говорится, что функция openDB() определена в строках 69 и 75 того же файла (video.php)   -  person Phil    schedule 22.07.2014
comment
@panther, спасибо, это сработало :-) @Phil да, я связал video.php внизу, но теперь утверждение не выполняется..   -  person saiy2k    schedule 22.07.2014


Ответы (3)


Есть похожий ответ на (несколько) похожий вопрос. Я уверен, что вы можете найти обходной путь для этой проблемы, но достаточно скоро вы будете искать, как исправить сеансы, сбросить конфигурацию среды и т. д., потому что PHPUnit — это среда модульного тестирования, а модули по определению — это меньшие вещи, чем запрос. .

Это область функционального/приемочного тестирования, и существует потрясающая структура под названием Behat. Вы должны провести собственное исследование, но, по сути, в то время как PHPUnit отлично подходит для тестирования более или менее независимых блоков функциональности, он отстой при тестировании более крупных вещей, таких как полное выполнение запроса. Позже вы начнете испытывать проблемы с ошибками сеанса, неправильно настроенной средой и т. д., и все потому, что каждый запрос должен выполняться в своем отдельном пространстве, а вы заставляете его делать противоположное. С другой стороны, Behat работает совсем по-другому: для каждого сценария (публикация робота, просмотр несуществующей страницы) он отправляет новый запрос на сервер и проверяет результат. Он в основном используется для окончательного тестирования всего, что работает вместе, путем утверждения конечного результата (объект ответа / html / json).

Если вы хотите правильно протестировать свой код, рассмотрите возможность использования для этого подходящих инструментов. Как только вы разберетесь с Behat, вы влюбитесь в него + вы сможете использовать PHPUnit внутри Behat, чтобы делать отдельные утверждения.

person Ian Bytchek    schedule 11.09.2014

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

Должен быть другой файл, в котором функция OpenDB() уже создана, или в файлах video.php. Вот почему Include_once сработало, потому что при первом открытии базы данных она вызвала эту функцию.

С этого момента проверьте все файлы, включенные в video.php, и найдите другую функцию OpenDB().

Но что-то мне подсказывает, что перед этими строками в вашем video.php уже есть openDB().

Если вы застряли, скопируйте весь код.

person Carnangel    schedule 17.09.2014

Я не совсем уверен, что происходит, но я думаю, что у вас может быть проблема с масштабом. Когда вы вызываете приложение Slim, две функции (openDB, findPageParameter) являются глобальными по объему, но я думаю, что когда вы запускаете их в модульном тесте, они являются частью класса модульного теста, а не глобальными. В результате тестовая среда не может найти две ваши функции, вам нужно явно передать их в ваше приложение или объявить их как глобальные.

На самом деле я несколько раз сталкивался с этой проблемой и обнаружил ее, сбросив все объекты, находящиеся в настоящее время, внутри определенного класса/функции.

Если вы еще этого не сделали, вы должны сделать дамп $rawResponse, чтобы увидеть, что на самом деле представляет собой сообщение об ошибке. Я предполагаю, что openDB can't be found или что-то в этом роде.

person ckm    schedule 18.09.2014