因此,我从头开始构建了一个WebAPI,包括一些我在网上找到的最佳实践,例如依赖注入(inject)和使用自动映射器的Domain DTO映射等。

我的API Controller 现在看起来与此相似

public MyController(IMapper mapper)
{
}

和AutoMapper注册表:
public AutoMapperRegistry()
{
    var profiles = from t in typeof(AutoMapperRegistry).Assembly.GetTypes()
                   where typeof(Profile).IsAssignableFrom(t)
                   select (Profile)Activator.CreateInstance(t);

    var config = new MapperConfiguration(cfg =>
    {
        foreach (var profile in profiles)
        {
            cfg.AddProfile(profile);
        }
    });

    For<MapperConfiguration>().Use(config);
    For<IMapper>().Use(ctx => ctx.GetInstance<MapperConfiguration>().CreateMapper(ctx.GetInstance));
}

我还在构建一些测试用例,实现MOQ,这让我感到有些不确定。每当调用 Controller 时,我都需要像这样传递一个IMapper:
var mockMapper = new Mock<IMapper>();
var controller = new MyController(mockMapper.Object);

但是,然后我如何配置IMapper以具有正确的映射?重新创建我在配置Mapper之前已经创建的相同逻辑是多余的。所以我想知道推荐的方法是什么?

最佳答案

这很简单:如果您模拟IMapper并将其想象成一个将数据从一个对象映射到另一个对象的完全抽象的概念,那么您必须将其视为一种抽象,而不意味着它背后有一个真正的自动映射器。

首先,您根本不应该注册任何现有的配置文件,而应该设置IMapper.Map方法以在给定另一个对象时返回特定的对象。

因此,对于用于特定方法的每个配置文件,您都必须进行设置,如下所示:

var mockMapper = new Mock<IMapper>();
mockMapper.Setup(x => x.Map<DestinationClass>(It.IsAny<SourceClass>()))
    .Returns((SourceClass source) =>
        {
            // abstract mapping function code here, return instance of DestinationClass
        });

在这种情况下,您的测试对实际的IMapper实现一无所知-它仅使用it方法从实际的IMapper实现中获取所需的数据。

关于unit-testing - 如何使用StructureMap依赖注入(inject)模拟Web API测试中的AutoMapper IMapper对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36074324/

10-10 05:12