我定义了一个 Pact,但是当对模拟进行指定的 PUT 调用时,我收到请求不匹配错误。我已经确认发送到模拟的消息字符串匹配。我在网上搜索过,尝试启用/禁用标头等,但没有成功。
有谁知道如何调试这个或者你能看到我的 Pact 可能做错了什么吗?
var config = new PactConfig
{
PactDir = PactDir,
Outputters = new List<IOutput> { new XunitOutput(output), new ConsoleOutput() },
LogLevel = PactLogLevel.Trace
};
_pact = PactNet.Pact.V3(_consumerName, _providerName, config).WithHttpInteractions();
// Define overall contract and pact mock behavior
_pact
// Define request made by consumer to provider
.UponReceiving("Object has null callback URL")
.Given("my provider state here")
.WithRequest(HttpMethod.Put, "/do_thing")
.WithHeader("Accept", "application/json; charset=utf-8")
.WithHeader("content-length", "170")
.WithHeader("Authorization", "Bearer")
.WithHeader("Host", mockUrl)
.WithBody(requestBody, "application/json; charset=utf-8")
// Define response by provider to consumer
.WillRespond()
.WithStatus(HttpStatusCode.OK)
.WithHeader("Content-Type", "application/json; charset=utf-8")
.WithJsonBody(expectedJobResponseDyn);
await _pact
.VerifyAsync(async context =>
{
mockUrl = context.MockServerUri.ToString().TrimEnd('/');
MyObject myObject = new() { CallbackUri = mockUrl};
requestBody = JsonSerializer.Serialize(myObject);
// Act //////////
ResponseObject result = await client.SendRequestAsync(myObject);
// Assert //////////
result.Code.Should().Be(someOtherObj.Code);
result.Message.Should().Be(someOtherObj.Message);
});
这是我收到的回复消息:
{"error":"Request-Mismatch : HttpRequest { method: \"PUT\", path: \"/do_thing\", query: None, headers: Some({\"host\": [\"127.0.0.1:58615\"], \"authorization\": [\"Bearer\"], \"content-length\": [\"170\"], \"content-type\": [\"application/json; charset=utf-8\"]}), body: Present(b\"{\\\"JobId\\\":\\\"00000000-0000-0000-0000-000000000000\\\",\\\"CallbackUri\\\":\\\"http://127.0.0.1:58615\\\"}\", Some(ContentType { main_type: \"application\", sub_type: \"json\", attributes: {\"charset\": \"utf-8\"}, suffix: None }), None), matching_rules: MatchingRules { rules: {} }, generators: Generators { categories: {} } }"}
该测试确实应该有一个人类友好的输出到标准输出,您显示的日志消息实际上是一条调试消息。如果这就是您得到的全部内容,那么这应该是 Pact .NET 的错误报告或功能请求,以使其更像其他客户端语言。
很难说,但也许您期望发送的正文 (
requestBody
) 与您发送的内容不匹配:
{"JobId":"00000000-0000-0000-0000-000000000000","CallbackUri":"http://127.0.0.1:58615"}