2010-02-26 23 views
17

Was ist der beste Weg, ein Mock expection für die Map-Funktion in AutoMapper einrichten.Mock AutoMapper Mapper.Map Anruf mit Moq

ich extrahieren Sie die IMapper-Schnittstelle, so kann ich das Setup für diese Schnittstelle erwartet. Mein Mapper hat Abhängigkeiten, also muss ich diese dem Mapper übergeben.

Was passiert, wenn ich zwei Instanzen meiner Mapper-Klasse erstellen, mit 2 verschiedenen Abhängigkeits Implementierungen? Ich nehme an, dass beide Mapper dieselbe Abhängigkeitsinstanz verwenden, da die AutoMapper-Map statisch ist. Oder AutoMapper könnte sogar eine Ausnahme auslösen, weil ich versuche, zwei verschiedene Maps mit denselben Objekten zu erstellen.

Was ist der beste Weg, dies zu lösen?

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

Antwort

25

Was ist der beste Weg, ein Mock expection für die Map-Funktion in AutoMapper Setup

Hier ist ein Weg, [?]:

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

Was Sie tun müssen, ist Setup AutoMapper wie folgt aus (StructureMap ist IoC). Dann können Sie Ihre Dienste von IMappingEngine abhängig machen. Von da an sollte es sehr leicht sein, es zu verspotten.

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