#c# #unit-testing
#c# #модульное тестирование
Вопрос:
Я пытаюсь создать модульный тест для своего сервиса, я высмеял все необходимое, как я могу имитировать методы репозитория, которые вызывает сервис, чтобы они имели ценность, а код не нарушался,
Это мой модульный тест:
public async Task Updateuser_ReturnsResponse()
{
// Arrange
var request = new UpdateUserRequest()
{
Guid = new Guid("92296ac1-f8e1-489a-a312-6ea9d31d60f8"),
FirstName = "TestFirst",
LastName = "TestLast",
PhoneWork = "9495467845",
EmailWork = "test123@yahoo.com",
};
var respose = new UpdateUserResponse()
{
Success = true
};
var getGuidRequest = new GetGuidRequest()
{
Guid = request.Guid
};
var getGuidResponse = new GetGuidResponse()
{
Guid = request.Guid
};
var mockUserRepository = new Mock<IUserRepository>();
var mockAwsProxy = new Mock<IAwsProxy>();
mockUserRepository.Setup(s => s.UpdateUserAsync(request)).ReturnsAsync(respose);
mockUserRepository.Setup(i => i.GetGuidAsync(getGuidRequest)).ReturnsAsync(getGuidResponse);
var sut = new FromService.UserService(....);
// Act
var response = await sut.UpdateUserAsync(request);
// Assert
Assert.NotNull(response);
Assert.True(response.Success);
}
Моя проблема заключается в том, что при вызове — var response = await sut .UpdateUserAsync(запрос); Он отправляется в сервис, и этот GuidResponse пуст, поэтому он прерывается после того, как показывает GuidResponse Null:
public async Task<UpdateUserResponse> UpdateUserAsync(UpdateUserRequest request)
{
if (request.EmailWork.HasValue() || request.Role.HasValue())
{
var GuidResponse = await userRepository.GetGuidAsync(new GetGuidRequest
{
Guid = request.Guid
});
// it breaks here because GuidResponse is Null.
if (GuidResponse.Guid != null amp;amp; request.EmailWork.HasValue())
{
.......
Ответ №1:
Сбой происходит из-за того, что настройка не соответствует тому, что было фактически задано макету при выполнении теста.
Используется It.Is<T>()
для сопоставления переданного параметра аргумента
//...omitted for brevity
mockUserRepository
.Setup(_ => _.GetGuidAsync(It.Is<GetGuidRequest>(x => x.Guid == request.Guid)))
.ReturnsAsync(getGuidResponse);
//...omitted for brevity
предполагая, что макет репозитория — это то, что было введено в SUT
Ссылка на быстрый запуск Moq: сопоставление аргументов