Я следил за учебным модулем и модифицировал его, чтобы проверить HTTP-запрос на приложение Micro MVC на основе этой публикации . Я могу успешно проверить выходную строку, однако я не уверен, как утверждать код состояния ответа или изменять путь запроса.
index.php
<?php $app = new \Phalcon\Mvc\Micro(); #Default handler for 404 $app->notFound(function () use ($app) { $app->response->setStatusCode(404, "Not Found")->sendHeaders(); }); $app->post('/api/robots', function() use ($app) { //Parse JSON as an object $robot = $app->request->getJsonRawBody(); //Build the response $app->response->setJsonContent($robot); return $app->response; }); $app->get('/', function() { echo 'Hello'; }); $app->handle();
Тесты / UnitTest.php
class MvcMicroUnitTest extends \UnitTestCase { public function testNotFound() { $path = '/invalid'; $mockRequest = $this->getMock("\\Phalcon\\Http\\Request"); //TODO: Set an invalid URL $path in the mock $this->di->set('request', $mockRequest, true); include("../index.php"); //TODO: Assert status is 404 $this->expectOutputString(''); } public function testPostRobot() { $rawJson = '{"name":"C-3PO","type":"droid","year":1977}'; $path = '/api/robots'; $mockRequest = $this->getMock("\\Phalcon\\Http\\Request", array( "getJsonRawBody")); $mockRequest->expects($this->any()) ->method("getRawBody") ->will($this->returnValue($rawJson)); //TODO: Set the $path in the mock $this->di->set('request', $mockRequest, true); include("../index.php"); //TODO: Assert status is 200 $this->expectOutputString($rawJson); } }
вclass MvcMicroUnitTest extends \UnitTestCase { public function testNotFound() { $path = '/invalid'; $mockRequest = $this->getMock("\\Phalcon\\Http\\Request"); //TODO: Set an invalid URL $path in the mock $this->di->set('request', $mockRequest, true); include("../index.php"); //TODO: Assert status is 404 $this->expectOutputString(''); } public function testPostRobot() { $rawJson = '{"name":"C-3PO","type":"droid","year":1977}'; $path = '/api/robots'; $mockRequest = $this->getMock("\\Phalcon\\Http\\Request", array( "getJsonRawBody")); $mockRequest->expects($this->any()) ->method("getRawBody") ->will($this->returnValue($rawJson)); //TODO: Set the $path in the mock $this->di->set('request', $mockRequest, true); include("../index.php"); //TODO: Assert status is 200 $this->expectOutputString($rawJson); } }
вclass MvcMicroUnitTest extends \UnitTestCase { public function testNotFound() { $path = '/invalid'; $mockRequest = $this->getMock("\\Phalcon\\Http\\Request"); //TODO: Set an invalid URL $path in the mock $this->di->set('request', $mockRequest, true); include("../index.php"); //TODO: Assert status is 404 $this->expectOutputString(''); } public function testPostRobot() { $rawJson = '{"name":"C-3PO","type":"droid","year":1977}'; $path = '/api/robots'; $mockRequest = $this->getMock("\\Phalcon\\Http\\Request", array( "getJsonRawBody")); $mockRequest->expects($this->any()) ->method("getRawBody") ->will($this->returnValue($rawJson)); //TODO: Set the $path in the mock $this->di->set('request', $mockRequest, true); include("../index.php"); //TODO: Assert status is 200 $this->expectOutputString($rawJson); } }
Хорошие новости и плохие новости. Хорошо: насколько вы используете стандартный принцип диспетчеризации, у вас будет ответ, который будет содержать необходимую вам информацию. Маленький трюк – при успешном статусе заголовка устанавливается значение false
.
/** * @param $expected * @throws ExpectationFailedException * @return $this */ protected function assertResponseCode($expected) { $actual = $this->di->getResponse()->getHeaders()->get('Status'); if ($actual !== false && $expected !== 200 && !preg_match(sprintf('/^%s/', $expected), $actual)) { throw new ExpectationFailedException(sprintf('Failed asserting that response code is "%s".', $expected)); } $this->assertTrue(true); return $this; }
Плохо: вы делаете это неправильно. Это область функциональных / приемочных испытаний, и есть сказочная структура под названием Behat . Вы должны делать свои собственные исследования, но по существу, в то время как PHPUnit отлично справляется с тестированием более или менее независимых блоков функциональности, он отсасывает при тестировании более крупных вещей, таких как выполнение полного запроса. Позже вы начнете испытывать проблемы с ошибками сеанса, неправильно сконфигурированной средой и т. Д., Потому что каждый запрос должен быть выполнен в собственном отдельном пространстве, и вы вынуждаете его делать противоположное. Behat, с другой стороны, работает совсем по-другому, где для каждого сценария (после робота, просмотра несуществующей страницы) он отправляет новый запрос на сервер и проверяет результат. Он в основном используется для окончательного тестирования всего, что работает вместе, делая утверждения о конечном результате (объект ответа / html / json).