Как сохранить результаты прокси
Короткий ответ: мошенник уже хранит его. Вы можете убедиться в этом, посмотрев на вывод curl http://localhost:2525/imposters/6568
. Настоящий вопрос заключается в том, как воспроизвести сохраненный ответ?
Обычный сценарий использования прокси-серверов mountebank заключается в том, что вы записываете ответы прокси-сервера на одном работающем экземпляре mb
, сохраняете результаты, а затем запускаете следующий экземпляр mb
с этими сохраненными ответами. Способ, которым вы могли бы это сделать, состоит в том, чтобы тестируемая система общалась со службой, которую вы пытаетесь подключить через прокси-сервер mountebank при любых условиях, которые вам нужны, а затем сохраняла ответы (и их предикаты запроса), отправляя HTTP GET
или DELETE
на http://localhost:2525/imposters/6568?removeProxies=true&replayable=true
. Вы передаете тело JSON этого ответа в следующий экземпляр mb
либо через REST API, либо сохраняя его на диске и запуская mountebank с помощью команды что-то вроде mb --configfile savedProxyResults.json
. В этот момент mountebank предоставляет точно такие же ответы на запросы без подключения к нижестоящей службе.
Прокси создают новые заглушки
Ваш последний вопрос связан с пониманием того, как работает режим proxyAlways
. Режим proxyOnce
по умолчанию означает, что в первый раз, когда прокси-сервер mountebank видит запрос, который однозначно удовлетворяет предикату, он запрашивает нижестоящую службу и сохраняет ответ. В следующий раз, когда окажется, что запрос удовлетворяет предикатам точно такие же, он избегает нисходящего вызова и просто возвращает сохраненный результат. Он только однажды проксирует вниз по течению для одного и того же запроса. С другой стороны, режим proxyAlways
всегда отправляет запросы вниз по течению и сохраняет список ответов для одного и того же запроса.
Чтобы было понятно, в скопированном вами примере нас интересуют поля method
, path
и query
в запросе, поэтому, если мы видим два запроса с точно такой же комбинацией этих трех полей, нам нужно знать, следует ли отправлять сохраненный ответ обратно или продолжить прокси. Представьте, что мы сначала отправили:
GET /test?q=elephants
method
— это GET
, path
— это /test
, а query
— это q=elephants
. Поскольку это первый запрос, мы отправляем его нижестоящему серверу, который возвращает тело:
No results
Это будет верно независимо от того, какой режим прокси вы установили для mountebank, так как он должен запросить вниз по течению хотя бы один раз. Теперь предположим, что пока мы об этом думаем, нижестоящий сервис добавил слона, а затем наша тестируемая система делает тот же вызов:
GET /test?q=elephants
Если мы находимся в режиме proxyOnce
, тот факт, что слона добавили в реальный сервис, просто не будет иметь значения, мы продолжим возвращать наш сохраненный ответ:
No results
Вы увидите такое же поведение, если остановите процесс mountebank и перезапустите его, как описано выше. В сохраненном файле конфигурации вы увидите что-то вроде этого (немного упрощая):
"stubs": [
{
"predicates": [{
"deepEquals': {
"method": "GET",
"path": "/test",
"query": { "q": "elephants" }
}
}],
"responses": [
{
"is": {
"body": "No results"
}
}
]
}
]
Там только одна заглушка. Если, с другой стороны, мы используем proxyAlways
, то второй вызов GET /test?q=elephants
даст нового слона:
1. Jumbo reporting for duty!
Это важно, потому что если мы остановим процесс mountebank и перезапустим его, теперь наши тесты могут полагаться на тот факт, что мы будем циклически проходить через оба ответа:
"stubs": [
{
"predicates": [{
"deepEquals': {
"method": "GET",
"path": "/test",
"query": { "q": "elephants" }
}
}],
"responses": [
{
"is": {
"body": "No results"
}
},
{
"is": {
"body": "1. Jumbo reporting for duty!"
}
}
]
}
]
person
bbyars
schedule
18.04.2016