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.

Pruebas de MediatR y CQRS. ¿Cómo verificar que se llama al controlador?

Actualmente estoy tratando de implementar MediatR en mi proyecto, cubriéndolo con pruebas. Quiero asegurarme de que se haya llamado al Handle del controlador al enviar una solicitud.

Tengo esta consulta:

public class GetUnitsQuery : IRequest<List<UnitResponse>>
{
}

Controlador:

public class GetUnitsHandler : IRequestHandler<GetUnitsQuery, List<UnitResponse>>
{
    readonly IUnitRepository UnitRepository;
    readonly IMapper Mapper;

    public GetUnitsHandler(IUnitRepository unitRepository, IMapper mapper)
    {
        this.UnitRepository = unitRepository;
        Mapper = mapper;
    }

    public async Task<List<UnitResponse>> Handle(GetUnitsQuery request, CancellationToken cancellationToken)
    {
        return Mapper.Map<List<UnitResponse>>(UnitRepository.GetUnits());
    }
}

Enviar solicitud desde el controlador:

var result = await Mediator.Send(query);

¿Algún idea de cómo probar si se llama a un Handle cuando se especifica una consulta específica utilizando MoQ?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para probar si el método GetUnitsHandler.Handle es llamado al enviar una solicitud GetUnitsQuery usando Moq, puedes crear un objeto Mock de la interfaz IRequestHandler<getunitsquery,></getunitsquery,><unitresponse>> y luego llamar al método Setup para configurar lo que sucede cuando se llama al método Handle.

    Aquí hay un ejemplo de método de prueba:

    [Test]
    public async Task Handle_GetUnitsQuery_HandlerIsCalled()
    {
        // Arrange
        var mockHandler = new Mock<><getunitsquery,></getunitsquery,><unitresponse>>>();
        var mediator = new Mock<imediator>();
    
        mediator.Setup(m => m.Send(It.IsAny<getunitsquery>(), It.IsAny<cancellationtoken>()))
            .ReturnsAsync(new List<unitresponse>());
    
        // Act
        await mediator.Object.Send(new GetUnitsQuery());
    
        //Assert
        mockHandler.Verify(h => h.Handle(It.IsAny<getunitsquery>(), It.IsAny<cancellationtoken>()), Times.Once);
    }
    

    En este ejemplo, creamos un objeto Mock de la interfaz IRequestHandler<getunitsquery,></getunitsquery,><unitresponse>> y luego configuramos el objeto Mediator para que devuelva una lista vacía cuando se llame al método Send con un objeto GetUnitsQuery.

    Luego, llamamos al método Mediator.Send con un objeto GetUnitsQuery.

    Finalmente, verificamos que se llamó una vez al método Handle del objeto mockHandler con cualquier objeto GetUnitsQuery y cualquier CancellationToken.

Comments are closed.