【问题标题】:How to mock MediatR to perform xUnit test for Web API Controller如何模拟 MediatR 为 Web API 控制器执行 xUnit 测试
【发布时间】:2021-09-19 18:30:22
【问题描述】:

我正在尝试为控制器方法配置 xUnit 测试。在我的控制器中,我使用 MediatorR 进行处理程序调用。我已经创建了 mediatorR Handler 的固定装置并设置了返回预期的对象,但没有正确执行并出现错误

错误

控制器

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
          ??
    }
}

}

【问题讨论】:

    标签: c# moq xunit .net-5 fixtures


    【解决方案1】:

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

            mediatorMoq.Setup(x => x.Send(new GetHandHeldByIMEI(imei), It.IsAny<CancellationToken>())).Returns(handHeldWrapperDataViewMoq);
    
    

    【讨论】:

    • 此外,new GetHandHeldByIMEI(imei) 将在运行时失败,因为它们很可能有不同的实例。最好在那里使用It.*。但我猜他们最终会跨过那座桥。
    【解决方案2】:
    [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
           
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多