Symfony2 phpunitでJSON-APIの機能テストをします

JSONテキストを返すAPIをSymfony2で実装して、実際にリクエストを投げてその応答をテストしてみようと思います。

テスト対象のAPIコントローラ

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

class ApiController extends Controller
{
    // $ curl http://localhost/Xxxx/web/app_dev.php/api/ -d id=123 --data-urlencode name="Foo bar" -i
    public function indexAction(Request $request)
    {
        $params = $request->request->all();

        return new JsonResponse($params);
    }
}

テストコード

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Response;

// WebTestCase を継承すると、WebTestCase クラスがカーネルを準備してくれます
class JsonServerFunctionalTest extends WebTestCase
{
    private $client;

    public function setUp()
    {
        // ブラウザをシミュレートするクライアントを取得します
        $this->client = static::createClient();
    }

    public function testJsonUrl()
    {
        /*
         * リクエストを送信して、Crawler オブジェクトを得ます
         * Crawlerは、HTML/XML形式のレスポンスをパースして
         * DOMで操作できるメソッドを提供します(JSONは未対応?)
         */
        $crawler = $this->client->request('POST', '/api/',
            array('id' => 123, 'name' => 'Foo Bar'),        // parameters
            array(),                                        // files
            array(
                'Content-Type' => 'x-www-form-urlencoded'   // server
            )
        );

        $response = $this->client->getResponse();

        $this->assertEquals(200, $response->getStatusCode(),
            "レスポンスのステータスコードが 200 であること");

        $this->assertTrue(
            $response->headers->contains('Content-Type', 'application/json'),
            "レスポンスヘッダの Content-Type が 'application/json' であること"
        );

        // レスポンスボディを取得します
        $content = $response->getContent();

        $json = json_decode($content, true);
        $this->assertNotNull($json,
            'レスポンスボディがJSONテキスト(=JSONデコード成功)であること');

        // 以下、応答パラメータの検証など
    }
}