首页 > 解决方案 > 契约:如何匹配总和/联合类型?

问题描述

我有一个 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上没有找到一个很好的例子,我该如何归档它......

标签: javascripttypescriptmatchpactunion-types

解决方案


您在这里需要哪种语言?它被标记为 pact-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.


推荐阅读