我创建了这个项目来以更具交互性的方式展示我的问题。
我有一个端点,它返回一个包含对象列表的对象。我不想比较我的契约的实际值,我只想匹配类型。
我的契约看起来像这样:
@Pact(consumer = "Consumer", provider = "Provider")
fun multi(builder: PactBuilder): V4Pact {
return builder
.expectsToReceiveHttpInteraction("multi") { httpBuilder ->
httpBuilder
.withRequest { httpRequestBuilder ->
httpRequestBuilder
.path("/multi")
.method("GET")
}
.willRespondWith { httpResponseBuilder ->
httpResponseBuilder
.status(200)
.body(PactDslJsonBody()
.`object`("myData", PactDslJsonBody()
.eachLike("myData", 2)
.stringType("foo", "foo")
.`object`("bar", PactDslJsonBody()
.stringType("bar", "bar")
)
)
)
}
}
.toPact()
不幸的是,它实际上不仅匹配示例列表的大小,还匹配字段的值。
两者都不想要。
由于单个返回工作正常,我认为它与 .eachLike("myData", 2) 有关。
知道我做错了什么以及如何改变它以获得我想要的结果吗?
我已经尝试在 Pact Slack 工作区询问,但不幸的是没有人可以帮助我:(
问题似乎在于您在契约中给出了实际值。它匹配类型和值。这就是为什么它没有按照您想要的方式工作。
当您使用 stringType("foo", "foo") 之类的内容时,Pact 认为您希望键“foo”具有值“foo”。但你只想要任何字符串,对吗?
尝试使用 stringType("foo") 而不使用额外的“foo”。这样 Pact 就知道你想要一个字符串,但不关心它的值是什么。
与您的清单相同。确保当您使用eachLike时,您没有设置您不想匹配的确切值。
删除 Pact 设置中的特定值,只告诉它类型。那么 Pact 只会匹配类型,而不匹配实际数据。让我知道它是否有效。