Автомат для тестирования Nunit с пользовательскими решателями значений и внедрением зависимостей

#dependency-injection #nunit #automapper

Вопрос:

Я абсолютно не представляю, как я могу написать модульный тест, потому что я не уверен, как я могу протестировать свою конфигурацию автоматического отображения, которая использует введенный экземпляр DbContext.

Картографический профиль:

         //SalesPoolDTO => SalesPool    
        CreateMap<SalesPoolDTO, SalesPool>().PreserveReferences().EqualityComparison((src, dst) => src.Id == dst.Id)            
            .ForMember(domainModel => domainModel.Id, conf => conf               
                .MapFrom<DtoIdValueResolver<SalesPoolDTO, SalesPool>,  Guid>(src => src.Id))
                          
            .ForMember(domainModel => domainModel.Caption, conf => conf.MapFrom(src => src.Caption))          
            .ForMember(domainModel => domainModel.Customers, conf => conf                     
                 .MapFrom<DtoCollectionResolver<SalesPoolDTO, SalesPool, ICollection<CustomerDTO>, ICollection<Customer>>, ICollection<CustomerDTO>>(src => src.Customers))          
            .ForMember(domainModel => domainModel.SalesOrderJournals, conf => conf.MapFrom(src => src.SalesOrderJournals))                        
            .ForAllOtherMembers(opt => opt.Ignore());
 

Мои упрощенные классы преобразователей пользовательских значений:

 public class DtoCollectionResolver<TDtoSource, TDomainModelDestination, TDtoCollection, TDomainModelCollection> 
    : DtoResolverBase, IMemberValueResolver<TDtoSource, TDomainModelDestination, TDtoCollection, TDomainModelCollection>
    where TDtoSource : class, IClientRecord
    where TDomainModelDestination : class, IRecord
    where TDtoCollection : class, IEnumerable<IClientRecord>
    where TDomainModelCollection : IEnumerable<IRecord>
{
    #region Constructors

    public DtoCollectionResolver(Db dbContext) : base(dbContext)
    {
    }

    #endregion Constructors

    #region Methods

    public TDomainModelCollection Resolve(TDtoSource src,
                                          TDomainModelDestination dest,
                                          TDtoCollection dtoCollection,
                                          TDomainModelCollection domainModelCollection,
                                          ResolutionContext rc)
    {
        //resolve collection here
        
        return domainModelCollection.AsEnumerable();;
    }
    #endregion Methods
}
public class DtoIdValueResolver<TDto, TDomainModel> : DtoResolverBase, IMemberValueResolver<IClientRecord, IRecord, Guid, Guid>
    where TDto : class, IClientRecord
    where TDomainModel : class, IRecord
{
    #region Constructors

    public DtoIdValueResolver(Db dbContext) : base(dbContext)
    {
    }

    #endregion Constructors

    #region Methods

    public Guid Resolve(IClientRecord source, IRecord destination, Guid sourceMember, Guid destMember, ResolutionContext context)
        => Resolve((TDto)source, (TDomainModel)destination, sourceMember, destMember, context);

    public Guid Resolve(TDto source, TDomainModel destination, Guid sourceMember, Guid destMember, ResolutionContext context)
    {
        //Resolve id value here
        return domainModel?.Id ?? default(Guid);
    }

    #endregion Methods
}
 

Таким образом, основная проблема заключается в том, что DbContext вводится в конструктор моего преобразователя значений, и я не знаю, как я могу использовать AutoMapper сейчас во время моих модульных тестов.

В настоящее время мои тесты завершатся неудачей, потому что нет конструктора без параметров.

Как теперь можно написать простой модульный тест, в котором AutoMapper инициализируется правильно, а DbContext вводится в класс ValueResolver