web-dev-qa-db-ja.com

Moqを使用したモックAutoMapperMapper.Map呼び出し

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);
    }
}
25
Alex Johansson

これが1つの方法です:

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

35
Mark Seemann

AutoMapperをモックする必要はありません。説明されているように、実際のAutoMapperを挿入するだけです ここ

var myProfile = new MyProfile();
var configuration = new MapperConfiguration(cfg => cfg.AddProfile(myProfile));
IMapper mapper = new Mapper(configuration);

このマッパーを単体テストに挿入できます。 AutoMapperのようなツールを使用することの全体的なポイントは、多くのマッピングコードを書く必要がないことです。 AutoMapperをモックすると、それを行う必要があります。

3
ataravati

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

AutoMapperへの依存関係を処理する別の方法を指摘します。これは、基本的に、自分のIMapperインターフェイスを抽出する試みに取って代わります。代わりに、既存のIMappingEngineをクラスの依存関係として使用して、それが機能するかどうかを確認します。

2
Alex Johansson

あなたがする必要があるのは、このように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>());
        }
    }
2
epitka