Контрактные тесты предназначены для проверки технического рукопожатия конечной точки. Он не должен использоваться для проверки поведения (с сохранением состояния). Разницу в http-кодах между 200 и 201 можно считать крайним случаем, но, по моему мнению, это semanti c one.
Поэтому я согласен с Marcin Grzejszczak в том, что вам следует издеваться над сервисом. С этим поддельным сервисом вы можете смоделировать поведение, если действительно настаиваете на определении контракта для указанного c http кода.
За исключением сценария ios, вы можете указать конкретный c первичный ключ, который будет представлять ситуацию, которая уже существует. Единственная проблема заключается в том, что когда потребитель вызывает «99999999», когда он вызывает заглушку, он будет соответствовать обоим контрактам (поскольку это значение также соответствует предоставленному регулярному выражению в контракте 201).
Если вы просто добавите «приоритет: 1» к контракту, контракт 200 будет иметь приоритет над контрактом 201, если задано свойство c.
Contract.make {
name("when put existing, expect 200")
request {
method 'PUT'
url "/path/to/resource"
headers {
contentType("application/json")
}
body(
"primaryKey": "99999999"
)
}
response {
status 200
body(
"generatedValue": $(p(regex('^[0-9a-zA-Z]+$')), c('abc123'))
)
}
priority 1
}
Вкл. со стороны производителя, вам нужно будет посмеяться над вашим сервисом, чтобы он правильно ответил, когда указано значение «99999999».
Я не думаю, что лично включил бы этот http-код в контрактные тесты, так как он представляет поведение с состоянием и, таким образом, является semanti c, а не техническим требованием подключения, по моему мнению. С обеих сторон я бы протестировал поведение данной ситуации в неинтеграционном модульном тесте. Хотя иногда бывает трудно отделить синтати c от семанти c в подобных ситуациях.