es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
“`

Tags:  , ,

Answer

  1. Avatar for 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 puerto3000no está expuesto al sistema principal. Para solucionar esto, es necesario exponer el puerto3000del contenedor al host. Esto se puede lograr agregando el métodoWithPortBinding(3000, false)al objetotestcontainersBuilder. Esto vinculará el puerto3000` del contenedor a un puerto aleatorio del host.

    var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()
                    .WithImage("bbyars/mountebank")
                    .WithName("mountebank")
                    .WithPortBinding(2525, false)
                    .WithPortBinding(3000, false) // agregar esta línea para exponer puerto 3000 al host
                    .WithHostname("localhost");
    

    Luego, es necesario actualizar el código para obtener el puerto asignado al puerto 3000 del contenedor. Se puede utilizar el método testContainers.GetMappedPublicPort(3000) para hacer esto.

    MountebankClient mbClient = new MountebankClient();
    
    var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()
                    .WithImage("bbyars/mountebank")
                    .WithName("mountebank")
                    .WithPortBinding(2525, false)
                    .WithPortBinding(3000, false) // agregar esta línea para exponer puerto 3000 al host
                    .WithHostname("localhost");
    
    var testContainers = testcontainersBuilder.Build();
    await testContainers.StartAsync();
    
    var hostPort = testContainers.GetMappedPublicPort(3000); // obtener el puerto del host para el puerto 3000 del contenedor
    
    var testImposter = mbClient.CreateHttpImposter(hostPort); // utilizar el puerto del host en la URL del imposter
    testImposter.AddStub().ReturnsBody(HttpStatusCode.OK, File.ReadAllText(@".\Stubs\testImposter.json"));
    mbClient.Submit(testImposter);
    

    Esto debería permitir que la aplicación realice una llamada a la URL del imposter en http://localhost:<host-port>.

Comments are closed.