2016-11-29 8 views
2

PHPUnitを使用してSlimアプリケーションのエンドポイントをテストしたいと思います。リクエストボディは常に空であるため、私はPOSTリクエストを模擬するのに苦労しています。PHPUnitでモックスリムエンドポイントPOSTリクエスト

  • 、ここで説明したように、私はアプローチを試してみた:Slim Framework endpoint unit testing。私が直接php://inputへの書き込みをしようとした
  • (環境変数slim-inputを追加すること)が、私は(苦労)

環境のエミュレーションは、例えばとして正しく動作する読み取り専用であるphp://inputを見つけましたREQUEST_URIは常に期待通りです。私は、要求の本文がSlim\Http\RequestBodyphp://inputから読み出されていることを知りました。

注:

  • 私が直接コントローラメソッドを呼び出さないようにしたいので、私は、エンドポイントを含むすべてのものを、テストすることができます。
  • 実際にリクエストを送信するので、guzzleを避けたいです。私はアプリケーションをテストしている間にサーバを稼動させたくない。これまで

私のテストコード:(私はstackoverflowの上のコードを簡略化してきたことに注意してください)

//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 

プロジェクト全体: 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

+1

にありましたグズル? – Tebe

+0

私は自分の質問のタイトルを変更しました。 PHPUnitを使用してエンドポイントをテストしたい –

+0

サンプルのエンドポイントとテストを教えてください。あなたの提供するコードが何をしようとしているのか分かりません。 – nerdlyist

答えて

0

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

元のブログ記事は、なぜだけでなくz.b.を使用してPOSTリクエストを送信するためにhttp://glenneggleton.com/page/slim-unit-testing