API Blueprint и 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'

Кто-нибудь знает, почему Дредд игнорирует тот факт, что "fakeParameter" на самом деле не отображается в теле ответа и все же позволяет пройти тест?

1 ответ

Решение

Вы столкнулись с ограничением MSON, языка API Blueprint, используемого для описания атрибутов. Во многих случаях MSON описывает, что МОЖЕТ присутствовать в структуре данных, а не то, что ДОЛЖНО присутствовать.

Наиболее заметным случаем являются массивы, где практически любое содержимое массива является необязательным, и, следовательно, базовая сгенерированная схема JSON не накладывает никаких ограничений на содержимое массива. Dredd просто уважает это, так что косвенно это тоже становится проблемой Dredd, однако Dredd мало что может с этим поделать.

Существует проблема для проблемы: apiaryio / mson # 66 Вы можете следить и комментировать под этой проблемой, чтобы быть в курсе этого. Dredd обычно очень оперативен в получении самого последнего парсера API Blueprint, поэтому, как только он будет реализован на самом языке, он не займет много времени, чтобы появиться в Dredd.

Очевидный (но утомительный) обходной путь - указать собственную схему JSON с более строгими правилами, используя + Schema раздел рядом с + Attributes раздел.

Другие вопросы по тегам