Puertos de impostor de charlatán inaccesibles cuando Mountebank se inició usando dotnet-testcontainers.
Estoy usando dotnet-testcontainers https://github.com/HofmeisterAn/dotnet-testcontainers para crear un contenedor con mountebank en mi prueba xUnit. Puedo crear con éxito un cliente de mountebank y crear un imposter con éxito. El problema es que cuando se ejecuta la prueba, la aplicación intenta hacer una llamada al imposter en http://localhost:3000 y se obtiene una conexión rechazada.
Puedo abrir con éxito http://localhost:2525 y puedo ver la página predeterminada de Mountebank. Así que mountebank funciona bien. También confirmé que el imposter se creó correctamente en el puerto 3000 mirando el registro del contenedor de Docker. También intenté usar Postman para hacer una llamada a mi imposter en http:localhost:3000 y obtuve una conexión rechazada.
¿Cuál podría ser el problema? ¿Es un problema de que el puerto 3000 en el contenedor Docker no está expuesto o algo así? A continuación se muestra mi código:
“`
MountebankClient mbClient = new MountebankClient();
var testcontainersBuilder = new TestcontainersBuilder<testcontainerscontainer>()
.WithImage("bbyars/mountebank")
.WithName("mountebank")
.WithPortBinding(2525, false)
.WithHostname("localhost");
var testContainers = testcontainersBuilder.Build();
await testContainers.StartAsync();
var testImposter = mbClient.CreateHttpImposter(3000);
testImposter.AddStub().ReturnsBody(HttpStatusCode.OK, File.ReadAllText(@".\Stubs\testImposter.json"));
mbClient.Submit(testImposter);
“`
davy.ai
El problema podría ser que la aplicación está intentando realizar una llamada a
http://localhost:3000` desde fuera del contenedor, lo cual no es alcanzable ya que el puerto
3000no está expuesto al sistema principal. Para solucionar esto, es necesario exponer el puerto
3000del contenedor al host. Esto se puede lograr agregando el método
WithPortBinding(3000, false)al objeto
testcontainersBuilder. Esto vinculará el puerto
3000` del contenedor a un puerto aleatorio del host.Luego, es necesario actualizar el código para obtener el puerto asignado al puerto
3000
del contenedor. Se puede utilizar el métodotestContainers.GetMappedPublicPort(3000)
para hacer esto.Esto debería permitir que la aplicación realice una llamada a la URL del imposter en
http://localhost:<host-port>
.