我有一个安息的api http://localhost:8080/books/{id},它返回带有特定ID的书。
ex:
获取http://localhost:8080/books/1
将返回
{" id":1,"页面":20,"价格":100}
获取http://localhost:8080/books/2
将返回
{" id":2,"页面":30,"价格":120}
我已经使用Regex代替{ID}来写了我的消费者期望,并生成了该协议。
现在提供商中没有数据。(数据库中没有书籍信息)。当我在提供商方面运行PACT VELFICATION时,它会失败,因为它无法通过击中实际服务来跨越合同来获取任何信息。
是否可以在提供商数据库中存在数据的情况下验证合同?还是有相同的解决方法?
,如果我们将提供商部署到多个环境中,提供商的DB也可以更改,如何处理?
感谢帮助。谢谢。
你为什么要解决这个问题?合同测试的重点是,您可以验证合同的两面是否得到适当满足!
您可能想查看提供商状态[1]。
您正在使用哪种语言?
提供的文章为您提供了一些背景。在JVM中,您可以查看@State注释https://github.com/dius/pact-jvm/tree/master/master/pact-jvm-provider-junit#example-example-of-http-test.
在您的消费者中,您将指定一个状态,例如"存在ID 1的书1"。在提供商方面,框架将调用与此期望相对应的@State注释。这使您有机会在测试案例运行之前确保存在任何状态数据(在这种情况下,该书)。
[1] https://docs.pact.io/documentation/provider_states.html
首先,上述URL都不可用。&很难使用此框架。
就我而言,我一直在尝试发送一个称为"业务日期"的请求参数,该参数期望具有" yyyy-mm-dd"的日期,并且以下选项似乎都没有起作用 -
matchQuery("business-date", "\d{4}-\d{2}-\d{2}", "2020-05-18")
query("business-date="+getBusinessDate())
queryMatchingDate("business-date", "yyyy-MM-dd")
matchQuery("business-date", "\d{4}-\d{2}-\d{2}")
queryMatchingDate("business-date", "yyyy-MM-dd")
queryMatchingISODate("business-date", "yyyy-MM-dd")
例外看起来像这样
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: [{ "error": "Unexpected request : tmethod: GETntpath: /api/batch_activities/ACTIVITY/STARTEDntquery: {}ntheaders: {X-b3-traceid=[6c88f0a1a0ae288e], Accept=[application/json], Connection=[ke... (443 bytes)]
Caused by: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: [{ "error": "Unexpected request : tmethod: GETntpath: /api/batch_activities/ACTIVITY/STARTEDntquery: {}ntheaders: {X-b3-traceid=[6c88f0a1a0ae288e], Accept=[application/json], Connection=[ke... (443 bytes)]
DSL的实例曾经看起来像下面 -
builder.given("Fetch Batch Activity by status")
.uponReceiving("Receiving Batch activity status").headers(headers).method(HttpMethod.GET)
.matchPath(pathRegex, path)
.matchQuery("business-date", "\d{4}-\d{2}-\d{2}")
.willRespondWith().status(200).headers(headers).body(jsonUtil.getObjectAsString(
formatBatchActivityForStatus(FeedExporterConstants.BATCH_STATUS_STARTED)))
.toPact();