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
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?
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.
Luego, actualiza tu código de prueba para utilizar Test Harness.
En este código, creamos un nuevo
InMemoryTestHarness
, que nos permite configurar unIRequestClient
para devolver una respuesta específica utilizando un filtro. Luego, utilizamos este cliente de solicitud para crear una instancia delSayHelloCommandHandler
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.