NSubstitute: невозможно вернуть значение типа Task`1 для IMapperBase.Map (ожидаемый тип List`1)

Пишу юнит-тест, в тесте хочу проверить свой 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: невозможно вернуть значение типа Task1 for IMapperBase.Map (expected type List1).

Я новичок в модульном тестировании и библиотеке NSubstitute, я не знаю, как издеваться над AutoMapper.


person sda2584541    schedule 27.02.2021    source источник
comment
Не нужно издеваться над IMapper, просто используйте настоящую вещь.   -  person Lucian Bargaoanu    schedule 27.02.2021
comment
@LucianBargaoanu, когда я ввожу IMapper, выдает ошибку: Следующие параметры конструктора не имеют совпадающих данных фиксации: IMapper mapper и результат поиска для этой ошибки [stackoverflow.com/questions/51155987/ тестовая среда, вам нужна фиктивная библиотека для внедрения фиктивного объекта через DI в ваши классы тестирования.)   -  person sda2584541    schedule 27.02.2021
comment
Не совсем. Многие люди делали это до вас, не издеваясь над AM.   -  person Lucian Bargaoanu    schedule 27.02.2021