【发布时间】:2016-03-18 00:54:47
【问题描述】:
所以我从头开始构建了一个 WebAPI,包括我在网上找到的一些最佳实践,例如依赖注入和域使用自动映射器进行 DTO 映射等。
我的 API 控制器现在看起来与此类似
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,这就是我感到有点不确定的地方。每当调用我的控制器时,我都需要像这样传入一个 IMapper:
var mockMapper = new Mock<IMapper>();
var controller = new MyController(mockMapper.Object);
但是,我如何配置 IMapper 以获得正确的映射?重新创建我之前已经创建的相同逻辑来配置 Mapper 感觉是多余的。所以我想知道推荐的方法是什么?
【问题讨论】:
-
几乎可以肯定你不需要模拟它,并且可以在测试设置中传入普通的 AutoMapper:模拟的映射器实际上不会映射对象,它只会记录它被要求这样做并返回你告诉它的东西。
-
测试是一个不同的项目。法线映射器在基础 api 项目中定义。这不会违背分离的目的吗?
-
你想在控制器级别的测试中完成什么?我同意@stuartd 的观点,即您不应该在控制器测试中模拟 AutoMapper。如果您使用真正的 AutoMapper 实现和设置,您的测试也将帮助您发现 AutoMapper 映射问题。
标签: unit-testing asp.net-web-api moq automapper structuremap