#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