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