使用 PHPUnit 模拟 Slim 端点 POST 请求

Flo*_*ser 6 php slim

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

  • 我已经尝试过此处描述的方法:Slim Framework 端点单元测试。(添加环境变量slim-input
  • 我尝试过直接写入php://input,但发现php://input是只读的(困难的方法)

环境模拟工作正常,例如REQUEST_URI始终如预期。我发现请求的正文是Slim\Http\RequestBodyphp://input中读出的。

笔记:

  • 我想避免直接调用控制器方法,这样我就可以测试所有内容,包括端点。
  • 我想避免,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
Run Code Online (Sandbox Code Playgroud)

整个项目(请注意,我已经简化了 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 ://discourse.slimframework.com/t/mock-slim-endpoint-post-requests-with-phpunit/973 。我会及时更新 stackoverflow 和 discourse.slimframework 的最新动态。

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

Flo*_*ser 5

在http://discourse.slimframework.com/t/mock-slim-endpoint-post-requests-with-phpunit/973/7上有帮助,解决方案是Request从头开始创建 \xc2\xa0 ,然后编写到请求正文。

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

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

\n