【问题标题】:Match JsonStructure in PhpUnit Test - Laravel 5.4在 PhpUnit 测试中匹配 JsonStructure - Laravel 5.4
【发布时间】:2017-07-28 04:58:38
【问题描述】:

我正在创建一个单元测试并想测试响应中返回的JSON 结构。我知道TestResponse 提供了一种方法assertJsonStructure 来匹配您的JSON 响应的结构。但由于某种原因,我无法将$structure 映射到我的回复,结果测试失败。让我分享所需的sn-ps。

端点响应

{
   "status": true,
   "message": "",
   "data": [
       {
          "id": 2,
          "name": "Shanelle Goodwin",
          "email": "chaz43@example.net",
          "created_at": "2017-03-05 16:12:49",
          "updated_at": "2017-03-05 16:12:49",
          "user_id": 1
       }
    ]
}

测试函数

public function testEndpoint(){

  $response = $this->get('/api/manufacturer/read', [], $this->headers);
  $response->assertStatus(200);
  $response->assertJsonStructure([
    'status',
    'message',
    'data' => [
      {
        'id',
        'name',
        'email',
        'created_at',
        'updated_at',
        'user_id'
      }
    ]
  ]);
  var_dump("'/api/manufacturer/read' => Test Endpoint");
}

data 数组中可以有多个节点,这就是为什么我试图在结构中提及该数组但似乎它没有正确映射。任何帮助将不胜感激:-)

【问题讨论】:

    标签: laravel unit-testing laravel-5 phpunit laravel-5.4


    【解决方案1】:

    我认为你应该使用:

     $response->assertJsonStructure([
        'status',
        'message',
        'data' => [
          [ // change here
            'id',
            'name',
            'email',
            'created_at',
            'updated_at',
            'user_id'
          ] // change here
        ]
      ]);
    

    【讨论】:

    • 你是对的,但它匹配 data 数组中的单个对象。我解决了这个问题并将其发布在下面。谢谢
    【解决方案2】:

    幸运的是,使用不同的选项我已经解决了这个问题。如果我们要匹配数组中的嵌套对象,则需要一个“*”作为键。我们可以在这里看到参考。

    Source: TestResponse

    我已经为array ofobjects`设置了这样的结构

    $response->assertJsonStructure([
        'status',
        'message',
        'data' => [
          '*' => [
            'id',
            'name',
            'email',
            'created_at',
            'updated_at',
            'user_id'
          ]
        ]
      ]);
    

    如果你只想匹配一个对象

    $response->assertJsonStructure([
        'status',
        'message',
        'data' => [
          [
            'id',
            'name',
            'email',
            'created_at',
            'updated_at',
            'user_id'
          ]
        ]
      ]);
    

    【讨论】:

    • 非常有用!应该在官方文档中。感谢您为我们钓鱼。
    • 当结构不匹配时,测试框架不会显示不匹配响应。我怎样才能访问它?
    • 一个道具的对象数组怎么样?您的解决方案对我有用,但它为此 => ['data' => ['*' => [name]]] 引发错误。这是一个错误而不是失败,它说:Argument #2 (No Value) of PHPUnit\Framework\Assert::assertArrayHasKey() must be a array or ArrayAccess。添加另一个道具后,错误消失了!
    • 对于任何想知道它是否不在文档上的人,它实际上在文档上:laravel.com/docs/8.x/http-tests#assert-json-structure
    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2018-05-14
    • 2018-01-30
    • 2019-01-28
    • 2022-11-20
    相关资源
    最近更新 更多