PactNet合同测试失败,出现HttpRequestException和SocketException



我正试图使用PactNet为以下方法编写一个合同测试:

public async Task<IEnumerable<Models.RefData.Instrument> GetInstruments(string issuerCountry, string instrumentType)
{
ValidateNotNullOrWhiteSpaceParameter(issuerCountry, nameof(issuerCountry));
ValidateNotNullOrWhiteSpaceParameter(instrumentType, nameof(instrumentType)); ;
var queryString = $"instruments?issuerCountry={HttpUtility.UrlEncode(issuerCountry)}&instrumentType={HttpUtility.UrlEncode(instrumentType)}";
int pageNo = 0;
int pageSize = 20;
_logger.LogDebug($"GetInstruments Request:{queryString}");
var httpResponseMessage = await _client.GetAsync(queryString + $"&page={pageNo}&size={pageSize}");
_logger.LogDebug($"GetInstruments Response Status Code:{httpResponseMessage.StatusCode}");
switch (httpResponseMessage.StatusCode)
{
case HttpStatusCode.OK:
var content = await httpResponseMessage.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<GetInstrumentsResponse>(content);

// if there are no results, return Empty
if (result.Metadata.TotalElements == 0)
{
return Enumerable.Empty<Models.RefData.Instrument>();
}
var instruments = new List<Models.RefData.Instrument>();
instruments.AddRange(result.Embedded.Instruments);
for (pageNo = 1; pageNo < result.Metadata.TotalPages; pageNo++)
{
var innerQueryString = queryString + $"&page={pageNo}&size={pageSize}";
_logger.LogDebug($"GetInstruments Request Additional Page:{innerQueryString}");
var httpResponseMessage2 = await _client.GetAsync(innerQueryString);
if (httpResponseMessage2.StatusCode != HttpStatusCode.OK)
{
_logger.LogError($"The requested page number {pageNo} gets response error {httpResponseMessage2.StatusCode.ToString()}.");
throw new UnexpectedResponseException(httpResponseMessage.StatusCode);
}
var content2 = await httpResponseMessage2.Content.ReadAsStringAsync();
var result2 = JsonConvert.DeserializeObject<GetInstrumentsResponse>(content2);
if (result2.Embedded.Instruments != null && result2.Embedded.Instruments.Any())
{
instruments.AddRange(result2.Embedded.Instruments);
}
}
if (instruments.Count != result.Metadata.TotalElements)
{
_logger.LogWarning($"Total number of instruments is different from MetaData.  MetaData states {result.Metadata.TotalElements}, however only {instruments.Count} instruments retrieved.");
}
_logger.LogDebug($"GetInstruments Result:{instruments.ToJson()}");
return instruments;
default:
throw new UnexpectedResponseException(httpResponseMessage.StatusCode);
}
}

我以此为指导创建了以下ConsumerPactTests.csConsumerPactClassFixture.cs

public class ConsumerPactTests : IClassFixture<ConsumerPactClassFixture>
{
private IMockProviderService _mockProviderService;
private string _mockProviderServiceBaseUri;
public ConsumerPactTests(ConsumerPactClassFixture fixture)
{
_mockProviderService = fixture.MockProviderService;
_mockProviderService.ClearInteractions(); //NOTE: Clears any previously registered interactions before the test is run
_mockProviderServiceBaseUri = fixture.MockProviderServiceBaseUri;
}
[Fact]
public void ItHandlesInvalidDateParam()
{
// Arange
var invalidRequestMessage = "issuerCountry or instrumentType is not valid";
_mockProviderService.Given("There is data")
.UponReceiving("A invalid GET request for Date Validation with invalid date parameter")
.With(new ProviderServiceRequest
{
Method = HttpVerb.Get,
Path = "/api/v2",
Query = "issuerCountry=USA&instrumentType=foo"
})
.WillRespondWith(new ProviderServiceResponse
{
Status = 400,
Headers = new Dictionary<string, object>
{
{ "Content-Type", "application/json; charset=utf-8" }
},
Body = new
{
message = invalidRequestMessage
}
});
// Act
RefDataHttpService sut = new RefDataHttpServiceBuilder().Build();
var result = sut.GetInstruments("USA", "foo").GetAwaiter().GetResult();
var resultBodyText = result.GetEnumerator();
// Assert
Assert.NotNull(resultBodyText);
}
}

public class ConsumerPactClassFixture : IDisposable
{
public IPactBuilder PactBuilder { get; private set; }
public IMockProviderService MockProviderService { get; private set; }
public int MockServerPort { get { return 9222; } }
public string MockProviderServiceBaseUri { get { return String.Format("http://localhost:{0}", MockServerPort); } }
public ConsumerPactClassFixture()
{
var pactConfig = new PactConfig
{
SpecificationVersion = "2.0.0",
PactDir = @"..........pacts",
LogDir = @".pact_logs"
};
PactBuilder = new PactBuilder(pactConfig);
PactBuilder.ServiceConsumer("Consumer")
.HasPactWith("Provider");
MockProviderService = PactBuilder.MockService(MockServerPort);
}
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// This will save the pact file once finished.
PactBuilder.Build();
}
disposedValue = true;
}
}
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
}
#endregion
}

当我运行测试时,我得到了这个错误:

dotnet测试-过滤器"FullyQualifiedName=债券。出版商测试。合同测试。ConsumerActTests。ItHandlesInvalidDateParam";

<blockquote\>测试运行c:\Workspace\prod\Test\Bond。出版商Tests\bin\Debug\netcoreapp3.1\Bond.Publisher.Tests.dll(.NETCoreApp,版本=v3.1(Microsoft(R(测试执行命令行工具版本16.7.0版权所有(c(Microsoft Corporation。保留所有权利。

正在启动测试执行,请稍候。。。

总共有1个测试文件与指定的模式匹配。[xUnit.net 00:00:10.95]债券。出版商测试。合同测试。ConsumerActTests。ItHandlesInvalidDateParam[失败]X债券。出版商测试。合同测试。ConsumerActTests。ItHandlesInvalidDateParam[4s 196ms]错误消息:系统网Http。HttpRequestException:由于目标计算机主动拒绝,因此无法建立连接。----系统。网插座。SocketException:由于目标计算机主动拒绝连接,因此无法建立连接。堆栈跟踪:在系统中。网Http。ConnectHelper。ConnectAsync(字符串主机,Int32端口,CancellationToken取消令牌(在系统中。网Http。HttpConnectionPool。ConnectAsync(HttpRequestMessage请求,布尔值allowHttp2,CancellationToken取消令牌(在系统中。网Http。HttpConnectionPool。CreateHttp11ConnectionAsync(HttpRequestMessage请求,CancellationToken取消令牌(在系统中。网Http。HttpConnectionPool。GetHttpConnectionAsync(HttpRequestMessage请求,CancellationToken取消令牌(在系统中。网Http。HttpConnectionPool。SendWithRetryAsync(HttpRequestMessage请求,布尔doRequestAuth,CancellationToken cancellionToken(在系统中。网Http。重定向处理程序。SendAsync(HttpRequestMessage请求,CancellationToken取消令牌(债券。出版商HttpMessageHandlers。UnoAuthorityHeaderMessageHandler。c:\Workspace\usprod\src\Bond中的SendAsync(HttpRequestMessage请求,CancellationToken取消令牌(。Publisher\HttpMessageHandlers\UnoAuthorityHeaderMessageHandler.cs:line 37在系统中。网Http。HttpClient。FinishSendAsyncBuffered(任务`1 sendTask,HttpRequestMessage请求,CancellationTokenSource cts,布尔处理cts(债券。出版商服务。RefDataHttpService。c:\Workspace\prod\src\Bond中的GetInstruments(String issuerCountry,String instrumentType(。Publisher\Services\RefDataHttpService.cs:line 52债券。出版商测试。合同测试。ConsumerActTests。c:\Workspace\prod\test\Bond中的ItHandlesInvalidDateParam((。出版商Tests\ContractTest\CustomerActTests.cs:line 52-----内部堆栈跟踪-----在系统中。网Http。ConnectHelper。ConnectAsync(字符串主机,Int32端口,CancellationToken取消令牌(

测试运行失败。

我怀疑这可能是某种身份验证问题,因为UnoAuthorisationHeaderMessageHandler.cs正在处理这个问题。我做错了什么?

对我来说,路径太长了。当我将项目移到离C:\更近的文件夹时,测试运行了。

系统。网插座。SocketException:由于目标计算机主动拒绝,无法建立连接。通常发生在没有服务器侦听您发送的url时。

检查ruby服务是否已启动并正在运行(测试运行程序启动它(,您应该在VisualStudio下的任务管理器中看到它

在调用pactBuilder之前,请小心。Build((,您应该能够通过PostMan向http://localhost:9222/instruments...

最新更新