Пишу юнит-тест, в тесте хочу проверить свой CashCapitalService
.
в моем сервисе я использовал AutoMapper
для сопоставления моей модели с dto и наоборот.
Моя служба:
public class CashCapitalService : ICashCapitalService
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
public CashCapitalService(IUnitOfWork unitOfWork, IMapper mapper)
{
_unitOfWork = unitOfWork;
_mapper = mapper;
}
public async Task<List<CashCapitalInsertAndUpdateDto>> GetAllAsync()
{
var allAsync = await _unitOfWork.CashCapitalRepository.GetAllAsync();
List<CashCapitalInsertAndUpdateDto> cashCapitalInsertAndUpdateDtos = _mapper.Map<List<CashCapitalInsertAndUpdateDto>>(source:allAsync);
return cashCapitalInsertAndUpdateDtos;
}
}
public class CashCapitalService : ICashCapitalService
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
public CashCapitalService(IUnitOfWork unitOfWork, IMapper mapper)
{
_unitOfWork = unitOfWork;
_mapper = mapper;
}
public async Task<List<CashCapitalInsertAndUpdateDto>> GetAllAsync()
{
var allAsync = await _unitOfWork.CashCapitalRepository.GetAllAsync();
List<CashCapitalInsertAndUpdateDto> cashCapitalInsertAndUpdateDtos = _mapper.Map<List<CashCapitalInsertAndUpdateDto>>(source:allAsync);
return cashCapitalInsertAndUpdateDtos;
}
}
как вы можете видеть, профиль Automapper:
public class CashCapitalInsertDtoProfile : Profile
{
public CashCapitalInsertDtoProfile()
{
CreateMap<CashCapitalInsertAndUpdateDto, CashCapital>().ReverseMap();
}
}
и в моем модульном тесте:
public class CashCapitalServiceTest
{
private readonly CashCapitalService _cashCapitalService;
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
public CashCapitalServiceTest()
{
_unitOfWork = Substitute.For<IUnitOfWork>();
_mapper = Substitute.For<IMapper>();
_cashCapitalService = new CashCapitalService(_unitOfWork, _mapper);
}
[Fact]
public async Task GetAllAsync_Should_GetAllCashCapital()
{
//Arrange
_unitOfWork.CashCapitalRepository.GetAllAsync().Returns(new List<CashCapital>());
var cashCapitals = new List<CashCapital>()
{
new CashCapital()
{
InsertDateTime = DateTime.Now,
AmountRial = 250000000,
Description = "tv,a lj,v"
}
};
var cashCapitalInsertAndUpdateDtos = new List<CashCapitalInsertAndUpdateDto>()
{
new CashCapitalInsertAndUpdateDto()
{
AmountRial = 250000000, Description = "tv,a lj,v"
}
};
//var returnValue = _mapper.Map(Arg.Any<List<CashCapital>>(), Arg.Any<List<CashCapitalInsertAndUpdateDto>>());
//_cashCapitalService.GetAllAsync().Returns(returnValue);
_mapper.Map(cashCapitals, cashCapitalInsertAndUpdateDtos).Returns(new List<CashCapitalInsertAndUpdateDto>()
{
new CashCapitalInsertAndUpdateDto()
{
AmountRial = 250000000, Description = "tv,a lj,v"
}
});
var resultValue = _mapper.Map(cashCapitals, cashCapitalInsertAndUpdateDtos);
_cashCapitalService.GetAllAsync().ReturnsForAnyArgs(resultValue);
//Act
var all = await _cashCapitalService.GetAllAsync();
//Assert
all.Should().BeOfType<List<CashCapitalInsertAndUpdateDto>>();
await _unitOfWork.CashCapitalRepository.Received(1).GetAllAsync();
}
}
Когда я запускаю этот тест, он не работает и дает мне ошибку:
Сообщение: NSubstitute.Exceptions.CouldNotSetReturnDueToTypeMismatchException: невозможно вернуть значение типа Task
1 for IMapperBase.Map (expected type List
1).
Я новичок в модульном тестировании и библиотеке NSubstitute, я не знаю, как издеваться над AutoMapper.
IMapper
, просто используйте настоящую вещь. - person Lucian Bargaoanu   schedule 27.02.2021IMapper
, выдает ошибку: Следующие параметры конструктора не имеют совпадающих данных фиксации: IMapper mapper и результат поиска для этой ошибки [stackoverflow.com/questions/51155987/ тестовая среда, вам нужна фиктивная библиотека для внедрения фиктивного объекта через DI в ваши классы тестирования.) - person sda2584541   schedule 27.02.2021