【问题标题】:HTTP client Cakephp 3 ignores json bodyHTTP 客户端 Cakephp 3 忽略 json 正文
【发布时间】:2016-03-07 09:53:33
【问题描述】:

我目前正在 Cakephp 3 中编写一个 RESTful API,我需要通过 http://host.com/api/pictures 测试一个 POST 操作。测试代码:

<?php
namespace App\Test\TestCase\Controller;

use App\Controller\Api\UsersController;
use Cake\TestSuite\IntegrationTestCase;
use Cake\Network\Http\Client;
use Cake\Network\Http\FormData;

class ApiPicturesControllerTest extends IntegrationTestCase{
    public $fixtures = [
        'app.users',
        'app.comments',
        'app.albums',
        'app.users_albums'
    ];

    public function testAdd(){
         // $data = new FormData();
         $accessToken ='eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjksImV4cCI6MTQ1NzYyOTU3NH0.NnjXWEQCno3PUiwHhnUCBjiknR-NlmT42oPLA5KhuYo';
         $http = new Client([
              'headers' => ['Authorization' => 'Bearer ' . $accessToken, 'Content-Type' => 'application/json']
         ]);
        $data = [
            "album_id" => 1,
            "link" => "http://www.google.com",
            "description" => "testtesttest",
            "favorite" => true
        ];
        $result = $http->post('http://vecto.app/api/pictures/add.json', $data, ['type'=>'json']);

        // $this->assertResponseOk();
        // debug($result);
  }
}

当我尝试调试结果时,我得到一个“无法添加或更新子行”,而我确定响应 ID 确实存在 (固定装置也有 id)。此外,日志表明它只尝试插入创建/更新行。因此,我很确定数据被忽略了,但是我找不到解决方案。我已经尝试过不同的标头组合,例如仅用于 Accept 的 application/json,用于 Content-Type 的 application/json 等。我正在使用 Cakephp 的 CRUD 插件将数据传递给 add 函数。

邮递员输出

此外,我尝试使用 Postman Chrome 插件来保存数据,并且确实有效。有谁知道我在测试中做错了什么?

【问题讨论】:

    标签: http phpunit cakephp-3.0 postman


    【解决方案1】:

    这不是集成测试用例的使用方式。您正在调度一个外部的真实请求,它将离开测试环境,而您应该使用集成测试用例提供的请求调度工具,即

    • IntegrationTestCase::get()
    • IntegrationTestCase::post()
    • IntegrationTestCase::put()
    • 等等……

    这些方法将发送不离开测试环境的模拟请求,这对于正常工作至关重要,因为您想使用测试连接、检查可能的异常、访问使用的会话等...

    即,您应该按照以下方式做一些事情

    $accessToken = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjksImV4cCI6MTQ1NzYyOTU3NH0.NnjXWEQCno3PUiwHhnUCBjiknR-NlmT42oPLA5KhuYo';
    
    $this->configRequest([
        'headers' => [
            'Authorization' => 'Bearer ' . $accessToken,
            'Content-Type' => 'application/json'
        ]
    ]);
    
    $data = [
        "album_id" => 1,
        "link" => "http://www.google.com",
        "description" => "testtesttest",
        "favorite" => true
    ];
    $this->post('/api/pictures/add.json', json_encode($data));
    

    请注意,application/json 的内容类型将要求您发送原始 JSON 数据!如果您实际上不需要/不想测试原始输入的解析,那么您可以跳过该标头,并将数组作为数据传递。

    另见

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多