【问题标题】:How do I write unit tests for a REST API built in Slim Framework?如何为 Slim 框架中构建的 REST API 编写单元测试?
【发布时间】:2014-02-14 05:47:17
【问题描述】:

我有一个像这样在 Slim 中内置的 API:

    $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 处理程序类可以轻松模拟通常由 DB 支持的结果。)

这是我不知道该怎么做的如何将请求欺骗到 Slim 中的细节。

【问题讨论】:

    标签: rest phpunit slim


    【解决方案1】:

    你可以试试this guidelines。它可能会帮助你。我为我的一个苗条项目尝试了它。

    如果有帮助,请告诉我。

    代码

    <?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 中的完整代码。 see this

    【讨论】:

    • 你不需要添加路由到$app 来使用它来测试更多的东西,而不仅仅是一个空的 Slim 服务器?也许您可以发布一些代码来展示您如何使用它来测试路线?
    • 另外,不应该存储Environment::mock() 的结果,以便它可以与\Slim\Http\Request::createFromEnvironment($environment) 之类的东西一起使用吗?我一直盯着这段代码,第一眼看起来不错,但我就是不明白如何使用它……也许这对 Slim 2 有意义,但 Slim 3 需要完全不同的方法?
    • 这种方法似乎更完整和 Slim 3-esque:stackoverflow.com/a/36111988/114558(有关更多信息,请参阅答案链接中的完整文章)
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多