AutoMapperのMap関数のモック期待値を設定するための最良の方法は何ですか。
IMapperインターフェイスを抽出して、そのインターフェイスの期待値を設定できるようにします。私のマッパーには依存関係があるので、それらをマッパーに渡す必要があります。
2つの異なる依存関係の実装でマッパークラスの2つのインスタンスを作成するとどうなりますか? AutoMapperマップは静的であるため、両方のマッパーが同じ依存関係インスタンスを使用すると思います。または、同じオブジェクトで2つの異なるマップを設定しようとすると、AutoMapperが例外をスローすることもあります。
これを解決するための最良の方法は何ですか?
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);
}
}
これが1つの方法です:
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());
AutoMapperをモックする必要はありません。説明されているように、実際のAutoMapperを挿入するだけです ここ :
var myProfile = new MyProfile();
var configuration = new MapperConfiguration(cfg => cfg.AddProfile(myProfile));
IMapper mapper = new Mapper(configuration);
このマッパーを単体テストに挿入できます。 AutoMapperのようなツールを使用することの全体的なポイントは、多くのマッピングコードを書く必要がないことです。 AutoMapperをモックすると、それを行う必要があります。
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>());
}
}