Asp.net mvc 3 使用automapper时如何对控制器进行单元测试?
这是我的控制器Asp.net mvc 3 使用automapper时如何对控制器进行单元测试?,asp.net-mvc-3,unit-testing,nunit,automapper,Asp.net Mvc 3,Unit Testing,Nunit,Automapper,这是我的控制器 [POST("signup")] public virtual ActionResult Signup(UserRegisterViewModel user) { if (ModelState.IsValid) { var newUser = Mapper.Map<UserRegisterViewModel, User>(user); var confirmatio
[POST("signup")]
public virtual ActionResult Signup(UserRegisterViewModel user)
{
if (ModelState.IsValid)
{
var newUser = Mapper.Map<UserRegisterViewModel, User>(user);
var confirmation = _userService.AddUser(newUser);
if (confirmation.WasSuccessful)
return RedirectToAction(MVC.Home.Index());
else
ModelState.AddModelError("Email", confirmation.Message);
}
return View(user);
}
调试单元测试时,我收到以下错误消息:“缺少类型映射配置或不支持的映射。”
我认为这是因为配置在web项目中,而不是单元测试项目中。我应该怎么做才能修复它?您需要配置映射器,因此在测试类设置中,而不是在每个测试设置中,调用代码来设置映射。注意,您可能还需要修改对用户服务调用的期望,因为参数不匹配,即它们是不同的对象。可能您需要一个测试来检查对象的属性是否与传递给方法的模型的属性匹配。您需要配置映射器,因此在测试类设置中,而不是在每个测试设置中,调用代码来设置映射。注意,您可能还需要修改对用户服务调用的期望,因为参数不匹配,即它们是不同的对象。可能您需要一个测试来检查对象的属性是否与传递给方法的模型的属性匹配。您应该真正为映射引擎使用一个接口,以便您可以模拟它,而不是使用AutoMapper,否则它是一个集成测试而不是单元测试 AutoMapper有一个名为
IMappingEngine
的接口,您可以使用IoC容器将该接口注入控制器,如下所示(此示例使用StructureMap)
类MyRegistry:Registry
{
公共注册处()
{
For().Use();
For().Use();
AddProfile(新的AutoMapperProfile());
For()。使用(()=>Mapper.Engine);
}
}
然后,您将能够使用依赖项注入将AutoMapper的映射引擎注入到控制器中,从而允许您参考以下映射:
[POST("signup")]
public virtual ActionResult Signup(UserRegisterViewModel user)
{
if (ModelState.IsValid)
{
var newUser = this.mappingEngine.Map<UserRegisterViewModel, User>(user);
var confirmation = _userService.AddUser(newUser);
if (confirmation.WasSuccessful)
return RedirectToAction(MVC.Home.Index());
else
ModelState.AddModelError("Email", confirmation.Message);
}
return View(user);
}
[发布(“注册”)]
公共虚拟操作结果注册(UserRegisterViewModel用户)
{
if(ModelState.IsValid)
{
var newUser=this.mappingEngine.Map(用户);
var确认=_userService.AddUser(newUser);
if(confirmation.wasuccessful)
返回重定向到操作(MVC.Home.Index());
其他的
ModelState.addmodeleror(“电子邮件”、确认消息);
}
返回视图(用户);
}
您可以在这里了解更多信息:您应该真正为映射引擎使用一个接口,以便您可以模拟它,而不是使用AutoMapper,否则它是一个集成测试而不是单元测试 AutoMapper有一个名为
IMappingEngine
的接口,您可以使用IoC容器将该接口注入控制器,如下所示(此示例使用StructureMap)
类MyRegistry:Registry
{
公共注册处()
{
For().Use();
For().Use();
AddProfile(新的AutoMapperProfile());
For()。使用(()=>Mapper.Engine);
}
}
然后,您将能够使用依赖项注入将AutoMapper的映射引擎注入到控制器中,从而允许您参考以下映射:
[POST("signup")]
public virtual ActionResult Signup(UserRegisterViewModel user)
{
if (ModelState.IsValid)
{
var newUser = this.mappingEngine.Map<UserRegisterViewModel, User>(user);
var confirmation = _userService.AddUser(newUser);
if (confirmation.WasSuccessful)
return RedirectToAction(MVC.Home.Index());
else
ModelState.AddModelError("Email", confirmation.Message);
}
return View(user);
}
[发布(“注册”)]
公共虚拟操作结果注册(UserRegisterViewModel用户)
{
if(ModelState.IsValid)
{
var newUser=this.mappingEngine.Map(用户);
var确认=_userService.AddUser(newUser);
if(confirmation.wasuccessful)
返回重定向到操作(MVC.Home.Index());
其他的
ModelState.addmodeleror(“电子邮件”、确认消息);
}
返回视图(用户);
}
您可以在这里了解更多信息:将映射抽象到MappingEngine可能很酷 有时我使用以下方法来创建IOC Automapper 在IOC builder中:
builder.RegisterInstance(AutoMapperConfiguration.GetAutoMapper()).As<IMapper>();
将映射抽象到MappingEngine可能很酷 有时我使用以下方法来创建IOC Automapper 在IOC builder中:
builder.RegisterInstance(AutoMapperConfiguration.GetAutoMapper()).As<IMapper>();
我已经使用AutoMapper一年了,但我从未意识到ImapingEngine的存在。我一直在嘲笑除了AutoMapper之外的所有东西,总是想知道为什么我的测试失败了,然后去看看,发现AutoMapper没有配置。总是让人讨厌。我已经使用AutoMapper一年了,但我从未意识到IMappingEngine的存在。我一直在嘲笑除了AutoMapper之外的所有东西,总是想知道为什么我的测试失败了,然后去看看,发现AutoMapper没有配置。总是让人讨厌。有了界面会更好:)
builder.RegisterInstance(AutoMapperConfiguration.GetAutoMapper()).As<IMapper>();
public class AutoMapperConfiguration
{
public static IMapper GetAutoMapper()
{
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile<OrderModelMapperProfile>();
cfg.AddProfile<OtherModelMapperProfile>();
//etc;
});
var mapper = config.CreateMapper();
return mapper;
}
}
public MyController(IMapper mapper)
{
_mapper = mapper;
}