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.

Mock IRequestClient<> durante las pruebas de integración utilizando MassTransit

Estoy tratando de hacer pruebas de integración contra un Comando de MediatR cuyo controlador depende de un IRequestClient inyectado en su constructor.

public class SayHelloCommand : IRequest<string>
{
}

public class SayHelloCommandHandler : IRequestHandler<SayHelloCommand, string>
{
    private readonly IRequestClient<IGetProfileMessageResult> _profileClient;

    public SayHelloCommandHandler(IRequestClient<IGetProfileMessageResult> profileClient)
    {
        _profileClient = profileClient;
    }

    public async Task<string> Handle(SayHelloCommand request, CancellationToken cancellationToken)
    {
        var profile = (await _profileClient.GetResponse<IGetProfileMessageResult>(new {ProfileId = 1})).Message;

        return $"Hello {profile.FirstName}";
    }
}

He configurado mi suite de pruebas para usar InMemoryMassTransit, pero siempre que ejecuto mi prueba, se agota el tiempo cuando llega a la llamada usando IRequestClient<>. También he intentado simular el IRequestClient para que devuelva una respuesta predeterminada de esta manera –

[Test]
public async Task ShouldSayHello()
{
    var mockRequestClient = new Mock<IRequestClient<IGetProfileMessageResult>>();
    mockRequestClient.Setup(x => x.GetResponse<IGetProfileMessageResult>(It.IsAny<Object>(), default, default)
        .Result.Message).Returns(new GetProfileMessageResult
        {
            FirstName = "John"
        });

    serviceCollection.Add(new ServiceDescriptor(typeof(IRequestClient<IGetProfileMessageResult>), mockRequestClient.Object));

    var result = await SendAsync(command);

    result.Status.Should().BeFalse();
    result.Message.Should().Contain("John");
}

pero esto aún agota el tiempo.

¿Hay alguna manera de configurar InMemoryMassTransit para que devuelva una respuesta predeterminada cuando se llama al requestclient?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de configurar InMemoryMassTransit para que devuelva una respuesta predeterminada cuando se llame al cliente de solicitud en pruebas de integración es utilizar la herramienta de prueba de MassTransit (Test Harness).

    Primero, añade el paquete NuGet de Test Harness a tu proyecto de prueba.

    dotnet add package MassTransit.TestFramework
    

    Luego, actualiza tu código de prueba para utilizar Test Harness.

    [TestFixture]
    public class SayHelloCommandTests
    {
        InMemoryTestHarness _harness;
        SayHelloCommandHandler _sut;
    
        [OneTimeSetUp]
        public async Task Setup()
        {
            _harness = new InMemoryTestHarness();
    
            var requestClient = _harness.CreateRequestClient<igetprofilemessageresult>(
                timeout: TimeSpan.FromSeconds(10), 
                filter: () => new TestConsumeContext<igetprofilemessageresult>(new GetProfileMessageResult
                    {
                        FirstName = "John"
                    }));
    
            _sut = new SayHelloCommandHandler(requestClient);
    
            await _harness.Start();
        }
    
        [Test]
        public async Task ShouldSayHello()
        {
            var command = new SayHelloCommand();
    
            var result = await _sut.Handle(command, CancellationToken.None);
    
            result.Should().Be("Hello John");
        }
    
        [OneTimeTearDown]
        public async Task Teardown()
        {
            await _harness.Stop();
        }
    }
    

    En este código, creamos un nuevo InMemoryTestHarness, que nos permite configurar un IRequestClient para devolver una respuesta específica utilizando un filtro. Luego, utilizamos este cliente de solicitud para crear una instancia del SayHelloCommandHandler para las pruebas. Finalmente, iniciamos el Test Harness, ejecutamos la prueba y detenemos el Test Harness.

    Con este enfoque, podemos configurar el cliente de solicitud con una respuesta predeterminada que se devolverá durante las pruebas, sin encontrar el problema de tiempo de espera causado por la configuración predeterminada del IRequestClient en el código original.

Comments are closed.