AutoMapper配置文件和单元测试

我从使用一个大的AutoMapperConfiguration类到使用实际配置文件的AutoMapper。 全球现在看起来像这样(原谅现在的开放/关闭违规)

Mapper.Initialize(x =>
                       {
                          x.AddProfile<ABCMappingProfile>();
                          x.AddProfile<XYZMappingProfile>();
                          // etc., etc.
                  });

让我超越顶级的关键是以前一直阻止我使用配置文件的障碍是我的ninject绑定。 我永远无法使绑定工作。 之前我有这个绑定:

Bind<IMappingEngine>().ToConstant(Mapper.Engine).InSingletonScope();

我已经迁移到这个绑定:

Bind<IMappingEngine>().ToMethod(context => Mapper.Engine);

这现在可以工作,应用程序是功能性的,我有配置文件,而且事情很好。

顺利现在在我的单元测试中。 使用NUnit,我会设置我的构造函数依赖。

private readonly IMappingEngine _mappingEngine = Mapper.Engine;

然后在我的[Setup]方法中构建我的MVC控制器并调用AutoMapperConfiguration类。

[SetUp]
public void Setup()
{
    _apiController = new ApiController(_mappingEngine);
    AutoMapperConfiguration.Configure();
}

我现在修改了。

[SetUp]
public void Setup()
{
    _apiController = new ApiController(_mappingEngine);

    Mapper.Initialize(x =>
                          {
                              x.AddProfile<ABCMappingProfile>();
                              x.AddProfile<XYZMappingProfile>();
                              // etc., etc.
                          });
}

不幸的是,这似乎并不奏效。 当我点击一个使用映射的方法时,映射似乎没有被拾取,AutoMapper抛出一个异常,指出映射不存在。 有关如何/在测试中更改映射器定义/注入以解决此问题的任何建议? 我猜IMappingEngine字段的定义是我的问题,但不确定我有什么选项。

谢谢


您拥有的问题是使用静态Mapper.Engine ,它是某种包含AutoMapper配置的单例。 按照惯例, Mapper.Engine在配置后不应该改变。 因此,如果您希望通过为每个unittest提供AutoMapper.Profiler来配置Automapper,则应避免使用它。

更改非常简单:向类AutoMapperConfiguration实例添加它自己的实例AutoMapper.MappingEngine而不是使用全局静态Mapper.Engine

public class AutoMapperConfiguration 
{
    private volatile bool _isMappinginitialized;
    // now AutoMapperConfiguration  contains its own engine instance
    private MappingEngine _mappingEngine;

    private void Configure()
    {
        var configStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers());

        configStore.AddProfile(new ABCMappingProfile());
        configStore.AddProfile(new XYZMappingProfile());

        _mappingEngine = new MappingEngine(configStore);

        _isMappinginitialized = true;
    }

    /* other methods */
}

ps:全部样品在这里

链接地址: http://www.djcxy.com/p/12905.html

上一篇: AutoMapper Profiles and Unit Testing

下一篇: scrollview is showing only the last added subview