1

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

显然我遗漏了一些东西,因为即使我故意定义了一个我知道 API 响应中缺少的假“必需”参数,测试也总是通过。看来 Dredd 只是测试响应体(数组)的类型,而不是其中的类型参数

我的 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”实际上并没有出现在响应正文中并且仍然允许测试通过的事实?

4

1 回答 1

1

您遇到了MSON的限制,这是蓝图用于描述属性的语言API 。在许多情况下,MSON 描述了数据结构中可能存在的内容,而不是必须准确存在的内容。

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

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

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

于 2016-09-06T15:11:45.870 回答