laravel - 在PhpUnit测试中匹配JsonStructure-Laravel 5.4

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

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

端点响应

{
   "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数组中可以有多个节点,所以这就是为什么我尝试在结构中提及该数组,但似乎无法正确映射的原因。任何帮助将不胜感激:-)

最佳答案

幸运的是,通过使用其他选项,我解决了这个问题。如果我们要匹配数组中的嵌套对象,则以'*'作为键。我们可以在这里看到引用。

Source: TestResponse

我已经为array of对象设置了这样的结构

$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'
      ]
    ]
  ]);

关于laravel - 在PhpUnit测试中匹配JsonStructure-Laravel 5.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657551/

相关文章:

php - Laravel 队列/重命名作业表

mysql - 合并检索查询 laravel 5

vb.net - Jenkins 抛出未知的汇编错误

php - 在嵌套关系上添加 where 条件

php - Laravel 没有将模型加载到路由中

c# - 何时/如何对 CRUD 应用程序进行单元测试?

javascript - 数据类型 Jasmine

laravel-5 - Laravel Vue.js 与 CKeditor 4 和 CKFinder3(文件管理器)的集成

laravel-5 - Laravel Eloquent 如何选择和操作数据透视表中的行?

php - Laravel 数据库查询错误