json - 如何通过PhpUnit Testing在POST方法中传递JSON?

标签 json phpunit symfony webtest

我正在将symfony 3.0与phpUnit框架3.7.18一起使用

单元测试文件。
abcControllerTest.php

namespace AbcBundle\Tests\Controller;


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

class AbcControllerTest extends WebTestCase {


    public function testWithParams() {
        $Params = array("params" => array("page_no" => 5));
        $expectedData = $this->listData($Params);

        print_r($expectedData);
    }

    private function listData($Params) {
        $client = static::createClient();        
        $server = array('HTTP_CONTENT_TYPE' => 'application/json', 'HTTP_ACCEPT' => 'application/json');
        $crawler = $client->request('POST', $GLOBALS['host'] . '/abc/list', $Params,array(), $server);
        $response = $client->getResponse();
        $this->assertSame('text/html; charset=UTF-8', $response->headers->get('Content-Type'));
        $expectedData = json_decode($response->getContent());
        return $expectedData;
    }

}

Action :abc/列表

abcController.php
public function listAction(Request $request) {      
        $Params = json_decode($request->getContent(), true);
}

代码工作正常,但未给出预期结果。因为我试图将json参数从我的phpunit文件 abcControllerTest.php 传递给 Controller ​​ abcController.php 文件。
任何人都可以建议我如何实现相同的目标。

最佳答案

我更喜欢使用GuzzleHttp进行外部请求:

use GuzzleHttp\Client;

$client = new Client();

$response = $client->post($url, [
    GuzzleHttp\RequestOptions::JSON => ['title' => 'title', 'body' => 'body']
]);

注意:GuzzleHttp应该与一起安装。使用 Composer 。

但是,您始终可以使用与Symfony捆绑在一起的客户端:
public function testJsonPostPageAction()
{
    $this->client = static::createClient();
    $this->client->request(
        'POST', 
        '/api/v1/pages.json',  
        array(),
        array(),
        array('CONTENT_TYPE' => 'application/json'),
        '[{"title":"title1","body":"body1"},{"title":"title2","body":"body2"}]'
    );
    $this->assertJsonResponse($this->client->getResponse(), 201, false);
}

protected function assertJsonResponse($response, $statusCode = 200)
{
    $this->assertEquals(
        $statusCode, $response->getStatusCode(),
        $response->getContent()
    );
    $this->assertTrue(
        $response->headers->contains('Content-Type', 'application/json'),
        $response->headers
    );
}

关于json - 如何通过PhpUnit Testing在POST方法中传递JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41713684/

相关文章:

c++ - Android 服务器最佳实践

c# - 如何使用 Json.NET StringEscapeHandling.EscapeNonAscii

jquery - 从 Dribble api 解析 json "meta"

c# - 序列化为不涉及属性的json时如何忽略属性

php - Laravel 5 交响乐\组件\HttpKernel\异常\NotFoundHttpException : POST http://localhost/myproject/public/leads

php - 将自己的断言添加到 phpUnit 时组织参数的最佳方式

php - 测试输出到 php ://stdout with PHPUnit

php - 如何使用 Twig 显示动态图像 URL?

security - 不需要 UserProvider 的自定义身份验证

symfony - 无法加载 Twig 模板 (Symfony 2.8.8)