如何模拟 MediatR 为 Web API 控制器执行 xUnit 测试

How to mock MediatR to perform xUnit test for Web API Controller

我正在尝试为控制器方法配置 xUnit 测试。在我的控制器中,我使用 MediatorR 进行处理程序调用。我已经创建了 mediatorR Handler 的夹具并设置了 return 预期的对象,但没有正确执行并在

上出现错误

错误

控制器

public class MyController : ControllerBase
{

    private readonly IAppAmbientState appAmbientState;
    private readonly IMediator _mediator;

    public MyController (
        IAppAmbientState ambientState,
        IMediator mediator
       )
    {
        appAmbientState = ambientState;
        _mediator = mediator;
    }

   [HttpGet()]
    public async Task<IActionResult> GetHandHeldByIMEI(string imei)
    {
        try
        {
            var result = await _mediator.Send(new GetHandHeldByIMEI(imei));

            var returnResult = ResponseResultHelper.SuccessfulResult(result.HandHeld, result.ResultSummary);

            var serializeObject = JsonConvert.SerializeObject(returnResult, Formatting.None);

             return Content(serializeObject, "application/json");
        }
        catch (Exception e)
        {
            
        }
    }

测试

public class MyControllerTest
{
    private readonly MyController  sut;
    private readonly Mock<IMediator> mediatorMoq;
    private readonly Mock<IAppAmbientState> appAmbientStateMoq;
    

    public MyControllerTest()
    {
        mediatorMoq = new Mock<IMediator>();
        appAmbientStateMoq = new Mock<IAppAmbientState>();

        sut = new HandheldController(appAmbientStateMoq.Object, mediatorMoq.Object);
    }

    [Fact]
    public void GetHandHeldByIMEI_ShouldReturn_HandHeldWrapperDataView()
    {
        //Arrange
        var fixture = new Fixture();
        var imei = "imeiNo";
        var handHeldWrapperDataViewMoq = fixture.Create<HandHeldSummaryWrapperDataView>();
        mediatorMoq.Setup(x => x.Send(new GetHandHeldByIMEI(imei))).Returns(handHeldWrapperDataViewMoq);

        //Act
        ??

        //Assert
          ??
    }
}

}

根据您遇到的错误,您需要模拟 CancellationToken 这是一个可选参数:

mediatorMoq.Setup(x => x.Send(new GetHandHeldByIMEI(imei), 
    It.IsAny<CancellationToken>())).Returns(handHeldWrapperDataViewMoq);
[Fact]
public void GetHandHeldByIMEI_ShouldReturn_HandHeldWrapperDataView()
{
 //Arrange
   var fixture = new Fixture();
   var imei = "imeiNo";
   var handHeldWrapperDataViewMoq = fixture.Create<HandHeldWrapperDataView>();
        mediatorMoq.Setup(x => x.Send(new GetHandHeldByIMEI(imei), It.IsAny<CancellationToken>())).Returns(Task.FromResult(handHeldWrapperDataViewMoq));

    //Act
    var actualResult = sut.GetHandHeldByIMEI(imei);

    //Assert
       
 }