Pact验证提供程序,Pact :: UnexpectedIndex是什么意思?

时间:2017-03-22 09:58:47

标签: pact

我正在使用Pact进行消费者驱动合同测试。 在我的用例中,我的消费者“一些市场服务消费者”正在使用提供商“市场服务”。在一些市场服务消费者“生产”的合同看起来像这样:

{
"provider": {
    "name": "market-service"
},
"consumer": {
    "name": "some-market-service-consumer"
},
"interactions": [
    {
        "description": "Get all markets",
        "request": {
            "method": "GET",
            "path": "/markets"
        },
        "response": {
            "status": 200,
            "headers": {
                "Content-Type": "application/json; charset=utf-8"
            },
            "body": {
                "markets": [
                    {
                        "phone": "HBiQOAeQegaWtbcHfAro"
                    }
                ]
            },
            "matchingRules": {
                "$.headers.Content-Type": {
                    "regex": "application/json; charset=utf-8"
                },
                "$.body.markets[*].phone": {
                    "match": "type"
                },
                "$.body.markets": {
                    "min": 1,
                    "match": "type"
                }
            }
        }
    }
],
"metadata": {
    "pact-specification": {
        "version": "2.0.0"
    },
    "pact-jvm": {
        "version": "3.3.6"
    }
}

}

在提供者网站上,我使用的是pact-provider-verifier-docker¹。这是我的测试结果:

    WARN: Ignoring unsupported matching rules {"min"=>1} for path $['body']['markets']
    .....
       @@ -1,7 +1,7 @@
    {
      "markets": [
        ... ,
   -    Pact::UnexpectedIndex,
   +    Hash,
      ]
    }

   Key: - means "expected, but was not found". 
        + means "actual, should not be found". 
        Values where the expected matches the actual are not shown.

似乎测试工作正常 - “手机”测试有效。 但在这一点上,我不知道(预期)“Pact :: UnexpectedIndex”是什么意思,以及它失败的原因。这种期望来自哪里,如何解决?

¹特别是我自己的版本,它使用最新的外部依赖项。

1 个答案:

答案 0 :(得分:2)

正如您在此测试用例here中看到的那样,Pact :: UnexpectedIndex用于指示数组的长度超出预期。我认为它试图说的是数组末尾有一个额外的哈希值。 (我同意它一点都不清楚!我写了这段代码,所以我为它的混乱性质道歉。事实证明,编写pact代码最困难的部分是编写有用的diff输出。)

这个错误令人困惑的是,它应该允许你有额外的元素,因为你已经指定 Traceback (most recent call last): File "/root/Desktop/testing.py", line 12, in <module> connection.open(ip) File "/usr/lib/python2.7/telnetlib.py", line 227, in open self.sock = socket.create_connection((host, port), timeout) File "/usr/lib/python2.7/socket.py", line 575, in create_connection raise err error: [Errno 110] Connection timed out 最小长度为1.也许docker验证程序使用版本1匹配而不是版本2?