Соглашения: как сопоставить тип суммы / объединения?

#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)