我正在查看Pact的Python implementation并尝试设置提供者状态。似乎说这样做的方法是让提供者在服务中内置一个端点,调用该端点以使提供者处于正确的状态。问题是我无法找到关于该端点实际应该是什么样的文档。什么是输入,它返回什么等等。
我尝试查看默认的ruby implementation,这似乎意味着将提供程序置于特定状态的完全不同的机制。这看起来像是使用了一个ruby模块,它通过验证程序脚本得到require
d,而根本不涉及任何HTTP请求。
设置提供者状态的正确方法是什么?如果它需要设置其他端点,我需要知道该端点应该是什么样子。如果需要将类/模块导入验证程序脚本,我需要知道如何使用ruby以外的语言实现它。
答案 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
的文档阅读docs.pact.io上的“提供者状态”部分,了解提供者状态的介绍。
要在重放每次交互之前允许设置正确的数据,您需要创建一个接受JSON文档的HTTP端点(可能与提供者实际上可能存在,也可能不在同一个应用程序中) :
{
"consumer": "CONSUMER_NAME",
"state": "PROVIDER_STATE"
}
端点应同步为给定的使用者设置给定的提供者状态,如果无法识别提供者状态,则返回错误。如果多个使用者使用不同的数据定义相同的提供者状态,则在每个使用者中命名您的提供者状态将避免冲突。
运行CLI时需要以下标志:
--provider-states-setup-url
- 端点的完整网址,用于设置活动的使用者和提供者状态。
您应该在每次设置调用开始时清除所有现有数据,而不是拆除每次交互后创建的特定测试数据。这是一种更可靠的方法,可确保您的测试数据不会从一个测试泄漏到另一个测试。
请注意,HTTP端点实际上不必在您的应用程序中。它只需要访问与您的应用程序相同的数据存储。因此,如果您无法在测试套件中添加“仅测试”端点,请考虑制作一个单独的应用程序,该应用程序与您应用的数据存储区共享凭据。