#javascript #typescript #match #pact #union-types
#javascript #typescript #совпадение #соглашение #типы соединений
Вопрос:
У меня есть конечная точка api, которая должна возвращать массив типа sum. Как я могу написать для него соответствующий сопоставитель в пактах (версия javascript, потребительский сайт)?
Пример: представьте, что у нас есть конечная /api/events
точка, которая возвращает список словарей, каждый из которых представляет событие. Допустим, у нас есть два разных типа событий (которых на практике может быть несколько):
interface ContentAddedEvent {
type: "ContentAdded"
newContent: string
}
interface UserRegisteredEvent {
type: "Userregistered"
username: string
}
type Event = ContentAddedEvent | UserRegisteredEvent
/api/events
возвращает массив типа Event[]
. Как мне написать для него сопоставитель? Я не нашел хорошего примера в https://docs.pact.io/implementation_guides/javascript/readme#matching как я могу его заархивировать…
Ответ №1:
Какой язык вам здесь нужен? Он помечен как пакт-jvm, но, похоже, это вопрос, связанный с JS?
В большинстве современных реализаций вам нужно будет написать тест для каждого из двух сценариев (т. Е. Один тест для ContentAddedEvent
, а другой для UserRegisteredEvent
)
См. https://docs.pact.io/faq/#why-is-there-no-support-for-specifying-optional-attributes что касается проблемы необязательных типов, которая актуальна здесь (TL; DR — если вы говорите, что можете поддерживать оба типа, но когда-либо тестируете только один вариант, вы не можете гарантировать, что контракт поддерживается, поэтому Pact придерживается позиции, что вы должны явно проверять все варианты в объединении).
У нас есть новый механизм сопоставления, который проверяет наличие хотя бы одного из вызываемых типов arrayContaining
. См. https://github.com/pact-foundation/pact-js/tree/feat/v3.0.0#array-contains-matcher о том, как использовать этот сопоставитель. Он должен взаимодействовать между JS и JVM, но в данный момент ветка находится внутри beta
.
Комментарии:
1. Спасибо за ваш ответ. «arrayContaining» — это то, что я ищу. (И вы правы, я ищу решение в JavaScript / TypeScript)