Как написать модульные тесты для REST API, встроенного в Slim Framework?
У меня есть API, построенный в Slim, как это:
$app->group('/'.$endpoint, function () use ($app, $endpoint) {
$handler = Api\Rest\Handlers\Factory::load($endpoint);
if (is_null($handler)) {
throw new \Exception('No REST handler found for '.$endpoint);
}
$app->get('(/:id)', function ($id) use ($app, $handler) {
echo json_encode($handler->get($id));
});
$app->post('', function () use ($app, $handler) {
echo json_encode($handler->post($app->request->post()));
});
$app->put(':id', function ($id) use ($app, $handler) {
echo json_encode($handler->put($id, $app->request->put()));
});
$app->delete(':id', function ($id) use ($app, $handler) {
echo json_encode($handler->delete($id));
});
});
$endpoint
- это строка, например 'user';
Как я могу написать для него единичные тесты?
В идеале;
class RestUserTest extends PHPUnitFrameworkTestCase
{
public function testGet()
{
$slim = ''; // my slim app
// set route 'api/user/1' with method GET
// invoke slim
// ensure that what we expected to happen did
}
}
(Класс обработчика REST сделает его тривиальным, чтобы высмеять результаты, которые обычно поддерживаются БД.)
Это ничтожно, как обманывать запрос в Slim, что я не знаю, как это сделать.
Ответы
Ответ 1
Вы можете попробовать с этими рекомендациями. Это может вам помочь. Я попробовал это для одного из моих тонких проектов.
Сообщите мне, если это поможет.
Коды
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Slim\Environment;
class RoutesTest extends PHPUnit_Framework_TestCase
{
public function request($method, $path, $options = array())
{
// Capture STDOUT
ob_start();
// Prepare a mock environment
Environment::mock(array_merge(array(
'REQUEST_METHOD' => $method,
'PATH_INFO' => $path,
'SERVER_NAME' => 'slim-test.dev',
), $options));
$app = new \Slim\Slim();
$this->app = $app;
$this->request = $app->request();
$this->response = $app->response();
// Return STDOUT
return ob_get_clean();
}
public function get($path, $options = array())
{
$this->request('GET', $path, $options);
}
public function testIndex()
{
$this->get('/');
$this->assertEquals('200', $this->response->status());
}
}
полный код, размещенный в Gist. см. это
Ответ 2
Я автор и текущий смотритель этого проекта: https://github.com/there4/slim-unit-testing-example
В нем используются некоторые помощники, чтобы упростить интеграцию с Slim-приложениями.
Ответ 3
См. Тонкие тесты, например, как насмехаться Slim\Environment
, чтобы имитировать входящий запрос. Вы можете начать здесь: https://github.com/codeguy/Slim/blob/master/tests/SlimTest.php#L332
Ответ 4
вы можете использовать тестирование Codeception API/Unit Testing. Посмотрите следующую ссылку