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

时间:2016-09-06 14:45:09

标签: apiblueprint dredd

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

1 个答案:

答案 0 :(得分:1)

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

最突出的情况是数组,其中数组的基本任何内容都是可选的,因此底层生成的JSON模式不会对数组内容施加任何约束。 Dredd只是尊重这一点,所以间接地它也变成了一个Dredd问题,但是Dredd可以做的并不多。

此问题存在问题:apiaryio/mson#66您可以根据问题关注并发表评论以获取有关此问题的最新信息。 Dredd在获取最新的API Blueprint解析器时通常非常迅速,因此一旦用语言本身实现,Dredd中出现就不会很长。

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