Comment puis-je écrire des tests unitaires pour une API REST construite dans le cadre Slim?
j'ai une API construit en Slim comme ceci:
$app->group('/'.$endpoint, function () use ($app, $endpoint) {
$handler = ApiRestHandlersFactory::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
est une chaîne, par exemple 'user';
Comment dois-je m'y prendre pour faire des tests unitaires?
Idéalement;
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
}
}
(LA CLASSE REST handler ferait qu'il serait trivial de se moquer des résultats qui seraient ordinairement soutenus par un DB.)
C'est le grotesque comment faire pour mystifier la requête dans Slim que je ne sais pas faire.
4 réponses
Vous pouvez essayer avec directives. Il peut vous aider. J'ai essayé pour un de mes projets slim.
Laissez-moi savoir si cela aide.
Codes
<?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());
}
}
code complet hébergé dans Gist . voir le
je suis l'auteur et l'actuel gardien de ce projet: https://github.com/there4/slim-unit-testing-example
il utilise quelques helpers pour rendre les tests d'intégration des applications Slim un peu plus faciles.
voir le tests Slim par exemple de la façon de se moquer Slim\Environment
pour imiter une requête entrante. Vous pouvez commencer ici: https://github.com/codeguy/Slim/blob/master/tests/SlimTest.php#L332