Mock AutoMapper Mapper.Map вызов с использованием Moq - PullRequest
20 голосов
/ 26 февраля 2010

Каков наилучший способ установить фиктивное ожидание для функции карты в AutoMapper.

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

Что происходит, когда я создаю 2 экземпляра моего класса mapper с двумя различными реализациями зависимостей? Я предполагаю, что оба преобразователя будут использовать один и тот же экземпляр зависимости, поскольку карта AutoMapper является статической. Или AutoMapper может даже выдать исключение, потому что я пытаюсь настроить 2 разные карты с одинаковыми объектами .?

Какой лучший способ решить эту проблему?

public interface IMapper {
    TTarget Map<TSource, TTarget>(TSource source);
    void ValidateMappingConfiguration();
}

public class MyMapper : IMapper {
    private readonly IMyService service;

    public MyMapper(IMyService service) {
        this.service = service
        Mapper.CreateMap<MyModelClass, MyDTO>()
            .ForMember(d => d.RelatedData, o => o.MapFrom(s =>
                service.getData(s.id).RelatedData))
    }

    public void ValidateMappingConfiguration() {
        Mapper.AssertConfigurationIsValid();
    }

    public TTarget Map<TSource, TTarget>(TSource source) {
        return Mapper.Map<TSource, TTarget>(source);
    }
}

Ответы [ 3 ]

31 голосов
/ 26 февраля 2010

Каков наилучший способ установить фиктивное ожидание для функции карты в AutoMapper [?]

Вот один из способов:

var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());
2 голосов
/ 21 апреля 2010

Что вам нужно сделать, так это настроить AutoMapper (StructureMap - IoC). Тогда вы можете сделать свои услуги зависимыми от IMappingEngine. Оттуда издеваться должно быть очень легко.

public class AutoMapperConfigurationRegistry : Registry
    {
        public AutoMapperConfigurationRegistry()
        {
            ForRequestedType<Configuration>()
                .CacheBy(InstanceScope.Singleton)
                .TheDefault.Is.OfConcreteType<Configuration>()
                .CtorDependency<IEnumerable<IObjectMapper>>().Is(expr => expr.ConstructedBy(MapperRegistry.AllMappers));

            ForRequestedType<ITypeMapFactory>().TheDefaultIsConcreteType<TypeMapFactory>();

            ForRequestedType<IConfigurationProvider>()
                .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>());

            ForRequestedType<IConfiguration>()
                .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>());
        }
    }
2 голосов
/ 26 февраля 2010

http://richarddingwall.name/2009/05/07/mocking-out-automapper-with-dependency-injection/

Указывает на другой способ обработки зависимостей в AutoMapper, который в основном заменит мою попытку извлечь мой собственный интерфейс IMapper. Вместо этого я попытаюсь использовать существующий IMappingEngine в качестве зависимости для моих классов, чтобы проверить, работает ли это.

...