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.

18
demandé sur bcmcfc 2014-01-23 19:18:14

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

10
répondu Shaharia Azam 2016-04-17 21:35:20

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.

4
répondu Craig 2014-10-21 19:53:27

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

3
répondu Jeremy Kendall 2014-01-23 15:22:16

vous pouvez utiliser Codeception API tests/Tests Unitaires. Jetez un oeil à l' lien

0
répondu Ajay 2016-03-29 09:03:12