0

我有一个 restFul API http://localhost:8080/books/ {id} 它返回具有特定 ID 的书。

前任:

获取http://localhost:8080/books/1

将返回

{ "id" : 1, "pages" : 20, "price" : 100 }

获取http://localhost:8080/books/2

将返回

{ “id”:2,“pages”:30,“price”:120 }

我已经使用正则表达式代替 {id} 编写了我的消费者期望并生成了 PACT。

现在提供程序中没有数据。(数据库中没有图书信息)。当我在提供商端运行协议验证时,它会失败,因为它无法通过点击实际服务来交叉检查合同来获取任何信息。

是否可以在没有数据存在于提供商数据库中的情况下验证合同?或者有什么解决方法吗?

如果我们将提供者部署到多个环境中,提供者的数据库也会发生变化,如何处理?

感谢帮助。谢谢。

4

2 回答 2

0

你为什么要解决这个问题?合同测试的重点是让您可以验证合同的双方都得到了适当的满足!

您可能希望为此查看 Provider States [1]。

您使用哪种语言?

提供的文章为您提供了一些背景知识。在 JVM 中,您可以查看 @State 注解https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-provider-junit#example-of-http-test

在您的消费者中,您将指定一个状态,例如“给定 ID 为 1 的书存在”。在提供者端,框架会调用对应这个期望的@State注解。这使您有机会在测试用例运行之前确保存在任何状态数据(在本例中为那本书)。

[1] https://docs.pact.io/documentation/provider_states.html

于 2017-02-22T01:50:26.467 回答
-1

首先,上述 URL 均无效。& 使用这个框架太难了.. 没有一个 API 有适当的文档,而且当某些东西不起作用时也很血腥,它也没有给出适当的错误消息。

就我而言,我一直在尝试发送一个名为“business-date”的请求参数,它需要一个格式为“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: GET\n\tpath: \/api\/batch_activities\/ACTIVITY\/STARTED\n\tquery: {}\n\theaders: {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: GET\n\tpath: \/api\/batch_activities\/ACTIVITY\/STARTED\n\tquery: {}\n\theaders: {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();
于 2020-05-18T23:41:09.263 回答