使用Moq模拟AutoMapper Mapper.Map调用
问题描述:
在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);
}
}
答
请告诉我设置的最佳方式在AutoMapper地图功能的模拟厚望
这里有一种方法[?]:
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());
答
http://richarddingwall.name/2009/05/07/mocking-out-automapper-with-dependency-injection/
点另一种处理依赖到AutoMapper的方式,基本上会这样替换我的尝试来提取我自己的IMapper接口。相反,我会尝试使用现有的IMappingEngine作为我的类的依赖项,以查看是否有效。
答
你需要做的就是像这样设置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>());
}
}