2010-02-26 93 views
17

在AutoMapper中爲Map函數設置模擬期望的最佳方式是什麼?使用Moq模擬AutoMapper Mapper.Map調用

我提取IMapper接口,以便我可以設置期望的接口。我的映射器有依賴關係,所以我必須將它們傳遞給映射器。

當我創建2個我的映射器類,2個不同的依賴實現時會發生什麼?我假定兩個映射器都將使用相同的依賴實例,因爲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); 
    } 
} 

回答

25

請告訴我設置的最佳方式在AutoMapper地圖功能的模擬厚望

這裏有一種方法[?]:

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

你需要做的就是像這樣設置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>()); 
     } 
    }