2010-02-26 7 views
17

Quel est le meilleur moyen de configurer une simulation d'attente pour la fonction Carte dans AutoMapper.Appel Mapper AutoMapper Mapper.Map en utilisant Moq

J'extrais l'interface IMapper pour que je puisse configurer les attentes pour cette interface. Mon mappeur a des dépendances, donc je dois les transmettre au mappeur. Que se passe-t-il lorsque je crée 2 instances de ma classe de mappeur avec 2 implémentations de dépendances différentes? Je suppose que les deux mappeurs utiliseront la même instance de dépendance, puisque la carte AutoMapper est statique. Ou AutoMapper pourrait même lancer une exception car j'essaie de configurer 2 cartes différentes avec les mêmes objets.

Quelle est la meilleure façon de résoudre ce problème?

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

Répondre

25

Quelle est la meilleure façon de configurer un expection maquette pour la fonction de la carte dans AutoMapper

est ici une façon [?]:

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

Ce que vous devez faire est de configurer AutoMapper comme ceci (StructureMap est IoC). Ensuite, vous pouvez rendre vos services dépendants de IMappingEngine. De là à se moquer, ça devrait être très 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>()); 
     } 
    } 
Questions connexes