2

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

我尝试查看默认的ruby​​ 实现,它似乎暗示了一种完全不同的机制,用于将提供程序置于某种状态。看起来它使用了一个 ruby​​ 模块,该模块require由验证程序脚本获取,根本不涉及 HTTP 请求。

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

4

2 回答 2

2

根据Pact-Python 中的文档,您实际完成此操作的方式有点开放。就个人而言,我会怎么做,因为我通常不使用 Python 的节点提供程序在我的提供程序测试中,我会在未使用的端口上创建一个服务器,其目的是从协议接收状态并设置它们适当地。一旦你运行测试,这个小型服务器就会受到包含消费者、提供者和状态的 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"
    });
});

我希望这是有道理的。

于 2017-11-29T02:28:49.243 回答
0

这是提供者状态的文档https://github.com/pact-foundation/pact-provider-verifier/#api-with-provider-states

具有提供者状态的 API

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

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

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

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

运行 CLI 时需要以下标志:

--provider-states-setup-url- 设置活动消费者和提供者状态的端点的完整 url。

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


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

于 2017-12-02T23:54:55.487 回答