【问题标题】:Laravel test. assert exact JSON structureLaravel 测试。断言准确的 JSON 结构
【发布时间】:2020-02-01 20:03:17
【问题描述】:

我有一个 laravel API 项目。有很多安全数据不应该在 API 响应中显示给用户。我需要一些方法来编写测试,如果只有响应结构与测试中的预设结构完全相同,我可以获得true

所以,如果我的测试结构是 $structure = [ 'data' => ['_id', 'user' => ['name', 'email], 'title'];,但作为响应,我收到的字段或多或少,我需要让这个测试失败。

在我只找到的文档中:

assertJson - 期待准确的键 => 值,但我只需要一个键; assertJsonStructure - 即使某些字段丢失或响应包含其他字段,也返回 true。

【问题讨论】:

  • 你可以为此自定义函数
  • @N69S 当然可以。但我首先要寻找现有的东西。
  • 你想只测试结构还是数据?如果你想测试数据你可以使用$this->assertEquals(..., ...),如果你想确保某些值没有显示你可以使用$this->assertArrayNotHasKey();

标签: laravel phpunit laravel-testing


【解决方案1】:

使用Opis JSON Schema

$validator = new \Opis\JsonSchema\Validator();
$result = $validator->dataValidation($json, $schema);
PHPUnit::assertTrue($result->isValid(), "Mismatch json schema");

对于您的情况,请阅读有关requiredadditionalProperties 的更多信息:https://docs.opis.io/json-schema/1.x/object.html#required

您的 json 方案可能如下所示:

{
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer"
        }
      }
}

【讨论】:

  • 看起来不错。我可以要求嵌入式结构吗?像 ` [ 要求: ['_id' , 'title', 'user', 'user.name' , 'user.age'] ` .
  • 是的。我更新了我的答案并添加了一个示例 json 方案。
猜你喜欢
  • 2020-12-16
  • 2017-03-13
  • 2020-06-13
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多