37

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

6 に答える 6

47

AutoMapper[?] で Map 関数のモック期待値を設定する最良の方法は何ですか?

1 つの方法を次に示します。

var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());
于 2010-02-26T09:40:29.037 に答える
3

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

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

于 2010-02-26T10:31:59.183 に答える
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>());
        }
    }
于 2010-04-21T14:30:16.457 に答える