Имитатор имитатора возвращает значение null из класса контроллера в тесте xUnit

#c# #xunit #.net-5 #web-api-testing #mediatr

Вопрос:

У меня есть контроллер веб-API, и я пытаюсь протестировать конечную точку. Я использую MediatR в классе контроллера для метода ‘ GetHandHeldByIMEI()’ . Я использовал Setup (x => x.Send( new GetHandHeldByIMEI(imei)), но при отладке он возвращает значение null; не уверен, чего мне здесь не хватает?? смотрите, как показано ниже

введите описание изображения здесь

Тестовый класс

открытый класс MyTestControllerTest { частный только для чтения HandheldController sut; частный только для чтения Макет mediatorMoq; частный только для чтения макет appAmbientStateMoq;

 public HandheldControllerTest()
{
   mediatorMoq = new Mock<IMediator>();
   appAmbientStateMoq = new Mock<IAppAmbientState>();
   sut = new HandheldController(appAmbientStateMoq.Object, mediatorMoq.Object);
 }

 [Fact]
 public async Task GetHandHeldByIMEI_ShouldReturn_HandHeldWrapperDataView()
 {
    //Arrange
    var fixture = new Fixture();
    var imei = "imeiNo";
    var handHeldWrapperDataViewMoq = fixture.Create<HandHeldWrapperDataView>();
    var returnResultMoq = ResponseResultHelper.SuccessfulResult(handHeldWrapperDataViewMoq.HandHeld, handHeldWrapperDataViewMoq.ResultSummary);
        mediatorMoq.Setup(x => x.Send( new GetHandHeldByIMEI(imei), It.IsAny<CancellationToken>())).ReturnsAsync(handHeldWrapperDataViewMoq);

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

    //Assert
    Assert.Equal(handHeldWrapperDataViewMoq, actualResult);
}
 

Контроллер

 public class MyController : ControllerBase
{

    private readonly IAppAmbientState appAmbientState;
    private readonly IMediator _mediator;

    public HandheldController(
        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)
        {
            
        }
    }
 

Комментарии:

1. Вы уверены, что вашему макету делают инъекцию? Как вы создаете экземпляр sut ?

2. в тестовом классе; Я инициирую частный только для чтения HandheldController sut; У меня есть код обновления

3. @Toxic Вы не просматривали мой комментарий к последнему сообщению, прежде чем удалить его.

4. Ознакомьтесь с кратким описанием Moq , чтобы лучше понять, как использовать MOQ для моделирования зависимостей.

5. GetHandHeldByIMEI Ссылка на экземпляр, используемая в вашей настройке, и фактический экземпляр, используемый при выполнении теста, не совпадают, поэтому макет по умолчанию вернет значение null. Ослабьте соответствие с помощью It.IsAny<GetHandHeldByIMEI>() или It.Is<>(...) с помощью соответствующего условия