#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<>(...)
с помощью соответствующего условия