php - 使用 PHPUnit 模拟 Slim 端点 POST 请求

标签 php slim

我想用 PHPUnit 测试我的 Slim 应用程序的端点。我正在努力模拟 POST 请求,因为请求正文始终为空。

  • 我已经尝试过这里描述的方法:Slim Framework endpoint unit testing . (添加环境变量 slim-input )
  • 我试过写信给 php://input直接,但我发现 php://input只读(很难)

  • 环境模拟正常工作,例如 REQUEST_URI总是如预期的那样。我发现请求的正文是在 Slim\Http\RequestBody 中读出的。来自 php://input .

    笔记:
  • 我想避免直接调用 Controller 方法,这样我就可以测试一切,包括端点。
  • 我想避免 guzzle因为它发送了一个实际的请求。我不想在测试应用程序时运行服务器。

  • 到目前为止我的测试代码:
    //inherits from Slim/App
    $this->app = new SyncApiApp(); 
    
    // write json to //temp, does not work
    $tmp_handle = fopen('php://temp', 'w+');
    fwrite($tmp_handle, $json);
    rewind($tmp_handle);
    fclose($tmp_handle);
    
    //override environment
    $this->app->container["environment"] =
        Environment::mock(
            [
                'REQUEST_METHOD' => 'POST',
                'REQUEST_URI' => '/1.0/' . $relativeLink,
                'slim.input' => $json,
                'SERVER_NAME' => 'localhost',
                'CONTENT_TYPE' => 'application/json;charset=utf8'
            ]
        );
    
     //run the application
     $response = $this->app->run();
     //result: the correct endpoint is reached, but $request->getBody() is empty
    

    整个项目(请注意,我已经简化了 stackoverflow 上的代码):
    https://github.com/famoser/SyncApi/blob/master/Famoser.SyncApi.Webpage/tests/Famoser/SyncApi/Tests/

    笔记2:
    我在slimframework论坛上问过,链接:
    http://discourse.slimframework.com/t/mock-slim-endpoint-post-requests-with-phpunit/973 .我会及时更新 stackoverflow 和 discourse.slimframework 发生的事情。

    注 3:
    我的这个功能目前有一个开放的拉取请求:https://github.com/slimphp/Slim/pull/2086

    最佳答案

    http://discourse.slimframework.com/t/mock-slim-endpoint-post-requests-with-phpunit/973/7 有帮助,解决方案是创建 Request从头开始,并写入请求正文。

    //setup environment vals to create request
    $env = Environment::mock();
    $uri = Uri::createFromString('/1.0/' . $relativeLink);
    $headers = Headers::createFromEnvironment($env);
    $cookies = [];
    $serverParams = $env->all();
    $body = new RequestBody();
    $uploadedFiles = UploadedFile::createFromEnvironment($env);
    $request = new Request('POST', $uri, $headers, $cookies, $serverParams, $body, $uploadedFiles);
    
    //write request data
    $request->write(json_encode([ 'key' => 'val' ]));
    $request->getBody()->rewind();
    //set method & content type
    $request = $request->withHeader('Content-Type', 'application/json');
    $request = $request->withMethod('POST');
    
    //execute request
    $app = new App();
    $resOut = $app($request, new Response());
    $resOut->getBody()->rewind();
    
    $this->assertEquals('full response text', $resOut->getBody()->getContents());
    

    有助于回答的原始博客文章位于 http://glenneggleton.com/page/slim-unit-testing

    关于php - 使用 PHPUnit 模拟 Slim 端点 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40867377/

    相关文章:

    php - 如何在 slim 框架 v4 中添加 twig-view

    Slim 3 - 如何添加404模板?

    php - Monolog RotatingFileHandler 根据日志类型保存到特定文件

    php - Mysql 将行显示为列

    php - ps x 显示奇怪的命令 : -f html/index. php

    php - Slim Controller 问题 : must be an instance of ContainerInterface, 给定的 Slim\\Container 实例

    php - Slim 框架 fatal error : Uncaught exception 'InvalidArgumentException' with message 'Cannot create LogWriter

    php - 查询参数的 Swagger 注释

    php - 在 PHP5 类中,什么时候调用私有(private)构造函数?

    php - #1054 - 未知列 - 反引号问题