API Blueprint 和 Dredd - 响应中缺少必填字段,但测试仍然通过

API Blueprint and Dredd - Required field missing from response, but tests still pass

我正在使用 API Blueprint 和 Dredd 的组合来测试我的应用程序所依赖的 API。我在 API 蓝图中使用属性来定义响应正文的结构。

显然我遗漏了一些东西,因为测试总是通过,即使我有意定义了一个假的 "required" 参数,我知道 API 的响应中缺少该参数。似乎 Dredd 只是测试响应体(数组)的 type 而不是其中的参数类型 and.

我的 API 蓝图文件:

FORMAT: 1A
HOST: http://somehost.net

# API Title

## Endpoints [GET /endpoint/{date}]

+ Parameters

  + date: `2016-09-01` (string, required) - Date

+ Response 200 (application/json; charset=utf-8)

    + Attributes (array[Data])


## Data Structures

### Data

- realParameter: 2432432 (number)
- realParameter2: `some string` (string, required)
- realParameter3: `Something else` (string, required)
- realParameter4: 1 (number, required)
- fakeParam: 1 (number, required)

响应正文:

[
  {
    "realParameter": 31,
    "realParameter2": "some value",
    "realParameter3": "another value",
    "realParameter4": 8908
  },
  {
    "realParameter": 54,
    "realParameter2": "something here",
    "realParameter3": "and here too",
    "realParameter4": 6589
  }
]

还有我的 Dredd 配置文件:

reporter: apiary
custom:
  apiaryApiKey: somekey
  apiaryApiName: somename
dry-run: null
hookfiles: null
language: nodejs
sandbox: false
server: null
server-wait: 3
init: false
names: false
only: []
output: []
header: []
sorted: false
user: null
inline-errors: false
details: false
method: []
color: true
level: info
timestamp: false
silent: false
path: []
blueprint: myApiBlueprintFile.apib
endpoint: 'http://ahost.com'

有谁知道为什么 Dredd 忽略了 "fakeParameter" 实际上没有出现在响应正文中并仍然允许测试通过的事实?

您 运行 限制了 MSON, the language API Blueprint 用于描述属性的用途。在许多情况下,MSON 描述了数据结构中 MAY 的内容,而不是 MUST 确切存在的内容。

最突出的情况是数组,其中基本上数组的任何内容都是可选的,因此底层生成的 JSON 架构不会对数组内容施加任何限制。 Dredd 只是尊重这一点,因此它也间接成为 Dredd 的问题,但是 Dredd 对此无能为力。

该问题有一个问题:apiaryio/mson#66您可以关注该问题并在该问题下发表评论以获取有关此问题的最新信息。 Dredd 通常会非常迅速地获取最新的 API 蓝图解析器,因此一旦它在语言本身中实现,用不了多久就会出现在 Dredd 中。

明显(但乏味)的解决方法是使用 + Attributes 部分旁边的 + Schema 部分指定您自己的具有更严格规则的 JSON 模式。