2010-02-26 28 views
17

Làm cách nào tốt nhất để thiết lập tính năng mô phỏng hàm Map trong AutoMapper.Mock AutoMapper Mapper. Gọi điện bằng cách sử dụng Moq

Tôi trích xuất giao diện IMapper để tôi có thể thiết lập kỳ vọng cho giao diện đó. Người lập bản đồ của tôi có phụ thuộc, vì vậy tôi phải chuyển những người đó vào người lập bản đồ.

Điều gì xảy ra khi tôi tạo 2 trường hợp của lớp bản đồ của tôi, với 2 lần triển khai phụ thuộc khác nhau? Tôi cho rằng cả hai người lập bản đồ sẽ sử dụng cùng một cá thể phụ thuộc, vì bản đồ AutoMapper là tĩnh. Hoặc AutoMapper thậm chí có thể ném một ngoại lệ vì tôi cố gắng thiết lập 2 bản đồ khác nhau với cùng một đối tượng.?

Làm cách nào tốt nhất để giải quyết vấn đề này?

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

Trả lời

25

Whats cách tốt nhất để thiết lập một Nguyện vọng giả cho hàm Map trong AutoMapper

Dưới đây là một trong những cách [?]:

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

http://richarddingwall.name/2009/05/07/mocking-out-automapper-with-dependency-injection/

điểm một cách khác để xử lý các phụ thuộc vào AutoMapper, về cơ bản sẽ thay thế nỗ lực của tôi để trích xuất giao diện IMapper của riêng tôi. Thay vào đó, tôi sẽ cố gắng sử dụng IMappingEngine hiện có làm phụ thuộc cho các lớp học của tôi, để xem liệu nó có hoạt động hay không.

2

Những gì bạn cần làm là thiết lập AutoMapper như thế này (StructureMap là IoC). Sau đó, bạn có thể làm cho các dịch vụ của bạn phụ thuộc vào IMappingEngine. Từ đó chế giễu nó phải rất dễ dàng.

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>()); 
     } 
    } 
Các vấn đề liên quan