I am trying to run a test for my project that will need the whole API app to run by using process to start and run the application on a real TCP socket for eventual pact testing.
The API seems to start but my test fails to connect to the local host.
My test sets up the Process in a StartProcess class and uses dotnet run within the API app directory to run the app:
public class GetWeatherForecastTest
{
private Process StartProcess()
{
var processStartInfo = new ProcessStartInfo
{
FileName = "dotnet",
Arguments = "run",
WorkingDirectory = "../../../../ProcessAPI",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
var process = new Process { StartInfo = processStartInfo };
process.OutputDataReceived += (sender, args) => Debug.WriteLine(args.Data);
process.ErrorDataReceived += (sender, args) => Debug.WriteLine(args.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
return process;
}
[Fact]
public async Task GivenValidParameters_WhenGetWeatherForecast_ThenReturnForecast()
{
using (var process = StartProcess())
{
// Wait for the process to start and the server to be ready
await Task.Delay(5000);
using (var client = new HttpClient())
{
try
{
var response = await client.GetAsync("http://localhost:5083/WeatherForecast");
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
Assert.False(string.IsNullOrEmpty(responseString));
}
catch (Exception ex)
{
Debug.WriteLine($"Request error: {ex.Message}");
throw;
}
process.Kill();
}
}
}
}
The error response I get when running this test shows that the connection is refused.
[xUnit.net 00:00:09.25] System.Net.Http.HttpRequestException : No connection could be made because the target machine actively refused it. (localhost:5000)
[xUnit.net 00:00:09.25] ---- System.Net.Sockets.SocketException : No connection could be made because the target machine actively refused it.
[xUnit.net 00:00:09.25] Stack Trace:
[xUnit.net 00:00:09.25] at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
[xUnit.net 00:00:09.25] at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
[xUnit.net 00:00:09.25] at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
[xUnit.net 00:00:09.25] at System.Net.Http.HttpConnectionPool.InjectNewHttp11ConnectionAsync(QueueItem queueItem)
[xUnit.net 00:00:09.25] at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
[xUnit.net 00:00:09.25] at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
[xUnit.net 00:00:09.25] at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
[xUnit.net 00:00:09.25] at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
[xUnit.net 00:00:09.25] C:\Programming\ProcessAPI\ProcessAPI.Test\GetWeatherForecastTest.cs(33,0): at ProcessAPI.Test.GetWeatherForecastTest.GivenValidParameters_WhenGetWeatherForecast_ThenReturnForecast()
So the app does appear to start but the test is unable to connect to the locally running server.
dotnet runto start another process, you only use it during development to compile and start your project. When you build or publish your project withdotnet buildordotnet publishyou get an.exefile you can call directly.IClassFixture<WebApplicationFactory<Program>>. This will set up a test web host and ensure it runs before your tests are called. In those tests,_factory.CreateClient();is used to retrieve an HttpClient instance that talks to the test server