使用PHPUnit模拟Slim端点POST请求

使用PHPUnit模拟Slim端点POST请求,php,slim,Php,Slim,我想用PHPUnit测试Slim应用程序的端点。我正在努力模拟POST请求,因为请求正文总是空的 我已经尝试了下面描述的方法:。(添加环境变量slim input) 我试过写php://input直接,但我发现了php://input是只读的(很难) 环境的模拟工作正常,例如,REQUEST\u URI始终符合预期。我发现请求的正文在Slim\Http\RequestBodyfromphp://input 注: 我希望避免直接调用控制器方法,因此我可以测试一切,包括端点 我想避免狂饮,因为

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

  • 我已经尝试了下面描述的方法:。(添加环境变量
    slim input
  • 我试过写
    php://input
    直接,但我发现了
    php://input
    是只读的(很难)
环境的模拟工作正常,例如,
REQUEST\u URI
始终符合预期。我发现请求的正文在
Slim\Http\RequestBody
from
php://input

注:

  • 我希望避免直接调用控制器方法,因此我可以测试一切,包括端点
  • 我想避免狂饮,因为它会发送一个实际的请求。我不希望在测试应用程序时运行服务器
到目前为止,我的测试代码:

//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的代码):

注2: 我在slimframework论坛上问过,链接: . 我会让stackoverflow和Distance.slimframework了解最新情况

注3: 我目前有一个关于此功能的打开的pull请求:

在上有帮助,解决方案是从头开始创建
请求,并写入请求正文

//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());

帮助回答问题的原始博文位于

为什么不使用z.b.Guzzle发送发帖请求呢?我已经更改了问题的标题。我想用PHPUnit来测试端点,你能给我们一个端点和测试的例子吗?我不确定您提供的代码试图做什么。我已经添加了项目链接和测试代码。我没有指定端点代码,因为项目相当大。但是,在我的调试环境中,我可以验证
$request->getBody()
是否为空。我已经从使用此API的应用程序发出post请求,并且那里的$request->getBody()不是空的。