我正在使用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”实际上没有出现在响应体中并且仍允许测试通过的事实?
答案 0 :(得分:1)
您遇到了MSON的限制,API Blueprint语言用于描述属性。在许多情况下,MSON描述了数据结构中存在 MAY 的内容,而不是 MUST 确切存在的内容。
最突出的情况是数组,其中数组的基本任何内容都是可选的,因此底层生成的JSON模式不会对数组内容施加任何约束。 Dredd只是尊重这一点,所以间接地它也变成了一个Dredd问题,但是Dredd可以做的并不多。
此问题存在问题:apiaryio/mson#66您可以根据问题关注并发表评论以获取有关此问题的最新信息。 Dredd在获取最新的API Blueprint解析器时通常非常迅速,因此一旦用语言本身实现,Dredd中出现就不会很长。
明显(但繁琐)的解决方法是使用+ Schema
部分旁边的+ Attributes
部分,使用更严格的规则指定您自己的JSON模式。