У меня есть вспомогательная функция тестирования createUser
, которая отправляет HTTP-запрос к серверному API для создания пользователя. Серверный API вызывает метод на клиенте Auth0 для создания пользователя. Ответы, которые у меня есть, установлены для URL-адреса клиента Auth0 /api/v2/users
.
Я тестирую службу с двумя типами пользователей — владельцем учетной записи и приглашенным пользователем. Я дважды вызываю помощника перед всеми тестами:
const owner = await createUser('[email protected]');
const invitee = await createUser('[email protected]');
И я ожидаю, что owner
будет иметь [email protected]
в качестве электронного письма и [email protected]
электронное письмо для invitee
.
Чтобы вернуть два разных ответа, я использовал сценарии Wiremock. И на данный момент у меня есть такие ответы:
Пользователь №1
{
"scenarioName": "user-scenario",
"requiredScenarioState": "Started",
"newScenarioState": "owner-user",
"request": {
"method": "POST",
"urlPattern": "/api/v2/users"
},
"response": {
"status": 201,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"email": "[email protected]"
}
}
}
Пользователь №2
{
"scenarioName": "user-scenario",
"requiredScenarioState": "owner-user",
"request": {
"method": "POST",
"urlPattern": "/api/v2/users"
},
"response": {
"status": 201,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"email": "[email protected]"
}
}
}
Когда я запускаю тесты, Wiremock возвращает второй ответ для обоих вызовов createUser
. Второй ответ был создан после первого, и Wiremock отдает приоритет последнему созданному ответу. Я решил установить priority: 1
на первый ответ, чтобы заставить Wiremock вернуть его и, следовательно, изменить состояние сценария. Это сработало только при первом тестовом прогоне, но не для последующих.
Иногда, если я удаляю образ Wiremock Docker и запускаю контейнер с нуля, он возвращает ответы, как и ожидалось, но затем продолжает возвращать второй ответ для обоих вызовов.
Что я делаю неправильно, и если это не так, как я настроил сценарии, каковы могут быть возможные причины такого несоответствия?
Несколько способов снять шкуру с этой кошки - третий (шаблон ответа), вероятно, лучший.
Первый запрос переводит сценарий в состояние owner-user
, и после этого все запросы будут возвращать пользователя № 2 на время жизни экземпляра WireMock — в вашем случае контейнера докера — если он не будет сброшен.
Вы можете сбросить его так: PUT /__admin/scenarios/user-scenario/Started
.
Состояние сценария хранится в памяти, поэтому перезапуск контейнера также должен сбросить состояние на Started
.
Смотрите WireMock | Поведение с сохранением состояния | Сброс одного сценария
Возможно, вам вообще не понадобится использовать сценарии. Вы можете использовать тело запроса POST, чтобы решить, какую заглушку вызывать, исходя из отправляемого вами адреса электронной почты.
Предполагая, что полезная нагрузка вашего запроса выглядит следующим образом:
{
"email": "[email protected]"
}
Вы можете сопоставить тело запроса так:
{
"request": {
"method": "POST",
"urlPattern": "/api/v2/users",
"bodyPatterns": [
{
"matchesJsonPath": {
"expression": "$.email",
"equalTo": "[email protected]",
}
}
]
},
"response": {
"status": 201,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"email": "[email protected]"
}
}
}
{
"request": {
"method": "POST",
"urlPattern": "/api/v2/users",
"bodyPatterns": [
{
"matchesJsonPath": {
"expression": "$.email",
"equalTo": "[email protected]",
}
}
]
},
"response": {
"status": 201,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"email": "[email protected]"
}
}
}
Смотрите WireMock | Сопоставление запросов | Путь JSON для получения подробной информации.
Вы можете использовать значения, переданные WireMock в запросе в ответе, используя шаблон ответа следующим образом:
{
"request": {
"method": "POST",
"urlPattern": "/api/v2/users"
},
"response": {
"status": 201,
"headers": {
"Content-Type": "application/json"
},
"transformers": ["response-template"],
"jsonBody": {
"email": "{{jsonPath request.body '$.email'}}"
}
}
}
Смотрите WireMock | Шаблоны ответов | Помощник JSONPath для деталей.
Существует также множество помощников для генерации случайных данных в различных форматах, если вам нужно, чтобы каждый запрос возвращал какое-то другое значение (например, UUID) — см. WireMock | Шаблоны ответов | Помощник по случайным значениям для деталей.
Привет, @Robert Elliot, извини за такую запоздалую реакцию, но твой ответ решил мою проблему. Я использовал
bodyPatterns
, чтобы вернуть ответ на основе электронной почты. Большое спасибо!