2010-02-26 28 views
17

¿Cuál es la mejor manera de configurar una expectativa de simulación para la función de mapa en AutoMapper?Mock AutoMapper Mapper.Map llamada usando Moq

Extraigo la interfaz de IMapper para que pueda configurarlo para esa interfaz. Mi mapeador tiene dependencias, así que tengo que pasarlas al mapeador.

¿Qué sucede cuando creo 2 instancias de mi clase mapeador, con 2 implementaciones de dependencia diferentes? Supongo que ambos mapeadores usarán la misma instancia de dependencia, ya que el mapa AutoMapper es estático. O AutoMapper incluso podría arrojar una excepción porque trato de configurar 2 mapas diferentes con los mismos objetos.

¿Cuál es la mejor manera de resolver esto?

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

Respuesta

25

Cuál es la mejor manera de configurar un expection maqueta para la función de mapa en AutoMapper

Ésta es una forma [?]:

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

Lo que necesita hacer es configurar AutoMapper de esta manera (StructureMap es IoC). Entonces puede hacer que sus servicios dependan de IMappingEngine. Desde allí burlarse debería ser muy fácil.

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>()); 
     } 
    } 
Cuestiones relacionadas