契约:如何设置提供者状态

时间:2017-11-28 19:22:18

标签: python pact pact-python

我正在查看Pact的Python implementation并尝试设置提供者状态。似乎说这样做的方法是让提供者在服务中内置一个端点,调用该端点以使提供者处于正确的状态。问题是我无法找到关于该端点实际应该是什么样的文档。什么是输入,它返回什么等等。

我尝试查看默认的ruby implementation,这似乎意味着将提供程序置于特定状态的完全不同的机制。这看起来像是使用了一个ruby模块,它通过验证程序脚本得到require d,而根本不涉及任何HTTP请求。

设置提供者状态的正确方法是什么?如果它需要设置其他端点,我需要知道该端点应该是什么样子。如果需要将类/模块导入验证程序脚本,我需要知道如何使用ruby以外的语言实现它。

2 个答案:

答案 0 :(得分:1)

根据the documentation in Pact-Python,它有点开放,结果如何实现这一目标。就个人而言,我是如何做的,比如我通常不使用Python的节点提供商,在我的提供商测试中,我会在未使用的端口上创建一个服务器,其目的是从pact和set接收状态他们正确。一旦你运行测试,这个小型服务器就会受到包含消费者,提供者和州的JSON文件的约束。

例如,这是一个节点示例:

var http = require('http');

beforeAll(function(){
    // PROVIDER STATE LISTENER 
    http.createServer(function (req, res) {
        var body = [];
        // Ignore this bit, this is just how node does server request/response
        req.on('data', (chunk) => {
            body.push(chunk);
        }).on('end', () => {
            // Get body, parse JSON.  JSON includes 'consumer' string and 'states' array of string
            var json = JSON.parse(Buffer.concat(body).toString());


            // THIS IS WHERE YOU NEED TO SETUP YOUR STATE
            res.status = 200; 
            switch(json.state) {
                case "When User does something": // this is the actual name of the state that's specified by your consumer, which is found in the contract
                    // Setup any data that relates to your state here, like adding rows to a DB, setting environment variables, etc
                    break;
                // Add another states that are used in your provider tests
                default:
                    res.status = 500;
                    res.statusMessage = "Missing state '" + json.state + "'";
            }
            res.end(); // Send the response back
        });
    }).listen(9001);
})

// Run your tests
it("Test Pact Interactions", function() {
    return pact.verifyPacts({
        // options here
        providerStatesSetupUrl: "http://localhost:9001"
    });
});

我希望这是有道理的。

答案 1 :(得分:0)

以下是提供商状态https://github.com/pact-foundation/pact-provider-verifier/#api-with-provider-states

的文档

API与提供者国家

阅读docs.pact.io上的“提供者状态”部分,了解提供者状态的介绍。

要在重放每次交互之前允许设置正确的数据,您需要创建一个接受JSON文档的HTTP端点(可能与提供者实际上可能存在,也可能不在同一个应用程序中) :

{
  "consumer": "CONSUMER_NAME",
  "state": "PROVIDER_STATE"
}

端点应同步为给定的使用者设置给定的提供者状态,如果无法识别提供者状态,则返回错误。如果多个使用者使用不同的数据定义相同的提供者状态,则在每个使用者中命名您的提供者状态将避免冲突。

运行CLI时需要以下标志:

--provider-states-setup-url - 端点的完整网址,用于设置活动的使用者和提供者状态。

您应该在每次设置调用开始时清除所有现有数据,而不是拆除每次交互后创建的特定测试数据。这是一种更可靠的方法,可确保您的测试数据不会从一个测试泄漏到另一个测试。

请注意,HTTP端点实际上不必在您的应用程序中。它只需要访问与您的应用程序相同的数据存储。因此,如果您无法在测试套件中添加“仅测试”端点,请考虑制作一个单独的应用程序,该应用程序与您应用的数据存储区共享凭据。