Как написать модульные тесты для 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 — это строка, например «пользователь»;

Как мне написать модульные тесты для него?

Идеально;

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, чего я не знаю, как это сделать.


person bcmcfc    schedule 23.01.2014    source источник


Ответы (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 . см. это

person Shaharia Azam    schedule 28.01.2014
comment
Разве вам не нужно было бы добавлять маршруты к $app, чтобы использовать его для тестирования большего, чем просто пустой сервер Slim? Возможно, вы можете опубликовать код, показывающий, как вы используете это для проверки маршрута? - person rinogo; 07.07.2016
comment
Кроме того, не следует ли сохранить результат Environment::mock(), чтобы его можно было использовать с чем-то вроде \Slim\Http\Request::createFromEnvironment($environment)? Я продолжаю смотреть на этот код, и на первый взгляд он выглядит хорошо, но я просто не понимаю, как его использовать... Возможно, в Slim 2 это имело смысл, но Slim 3 требует совершенно другого подхода? - person rinogo; 07.07.2016
comment
Этот подход кажется более полным и похожим на Slim 3: stackoverflow.com/a/36111988/114558 (см. полный запись в ссылке на ответ для получения дополнительной информации) - person rinogo; 07.07.2016