2010-02-26 11 views
17

Qual è il modo migliore per impostare un'aspettativa di simulazione per la funzione Mappa in AutoMapper.Mock AutoMapper Mapper.Mappa chiamata utilizzando Moq

ho estrarre l'interfaccia IMapper così posso installare aspetta per tale interfaccia. Il mio mappatore ha dipendenze, quindi devo passare quelle al mappatore.

Cosa succede quando creo 2 istanze della mia classe mapper, con 2 diverse implementazioni di dipendenze? Suppongo che entrambi i mappatori utilizzeranno la stessa istanza di dipendenza, poiché la mappa di AutoMapper è statica. Oppure AutoMapper potrebbe lanciare un'eccezione perché cerco di impostare 2 mappe diverse con gli stessi oggetti.

cosa è il modo migliore per risolvere questo?

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); 
    } 
} 

risposta

25

Che cosa è il modo migliore per impostare un expection finto per la funzione Map in automapper

Ecco un modo [?]:

var mapperMock = new Mock<IMapper>(); 
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar()); 
2

Quello che devi fare è impostare AutoMapper come questo (StructureMap è IoC). Quindi puoi rendere i tuoi servizi dipendenti da IMappingEngine. Da lì, beffardo, dovrebbe essere molto facile.

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>()); 
     } 
    } 
Problemi correlati