asp.net-mvc – 使用AutoMapper的控制器上的单元测试
|
我正在尝试单元测试使用AutoMapping的UpdateUser控制器.这是控制器的代码 UpdateUserController private readonly IUnitOfWork _unitOfWork;
private readonly IWebSecurity _webSecurity;
private readonly IOAuthWebSecurity _oAuthWebSecurity;
private readonly IMapper _mapper;
public AccountController()
{
_unitOfWork = new UnitOfWork();
_webSecurity = new WebSecurityWrapper();
_oAuthWebSecurity = new OAuthWebSecurityWrapper();
_mapper = new MapperWrapper();
}
public AccountController(IUnitOfWork unitOfWork,IWebSecurity webSecurity,IOAuthWebSecurity oAuthWebSecurity,IMapper mapper)
{
_unitOfWork = unitOfWork;
_webSecurity = webSecurity;
_oAuthWebSecurity = oAuthWebSecurity;
_mapper = mapper;
}
//
// Post: /Account/UpdateUser
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateUser(UpdateUserModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
var userToUpdate = _unitOfWork.UserRepository.GetByID(_webSecurity.CurrentUserId);
var mappedModel = _mapper.Map(model,userToUpdate);
**mappedModel will return null when run in test but fine otherwise (e.g. debug)**
_unitOfWork.UserRepository.Update(mappedModel);
_unitOfWork.Save();
return RedirectToAction("Index","Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("",ErrorCodeToString(e.StatusCode));
}
}
return View(model);
}
这是我的单位测试 [Fact]
public void UserRepository_Update_User_Success()
{
Controller = new AccountController(UnitOfWork,WebSecurity.Object,OAuthWebSecurity.Object,Mapper);
const string emailAsUserName = "user@username.com";
const string password = "password";
const string email = "email@email.com";
const string emailNew = "newEmail@email.com";
const string firstName = "first name";
const string firstNameNew = "new first name";
const string lastName = "last name";
const string lastNameNew = "new last name";
var updatedUser = new User
{
Email = emailNew,FirstName = firstNameNew,LastName = lastNameNew,UserName = emailAsUserName
};
WebSecurity.Setup(
s =>
s.CreateUserAndAccount(emailAsUserName,password,new { FirstName = firstName,LastName = lastName,Email = email },false))
.Returns(emailAsUserName);
updatedUser.UserId = WebSecurity.Object.CurrentUserId;
UnitOfWork.UserRepository.Update(updatedUser);
UnitOfWork.Save();
var actualUser = UnitOfWork.UserRepository.GetByID(updatedUser.UserId);
Assert.Equal(updatedUser,actualUser);
var model = new UpdateUserModel
{
Email = emailAsUserName,ConfirmEmail = emailAsUserName,FirstName = firstName,LastName = lastName
};
var result = Controller.UpdateUser(model) as RedirectToRouteResult;
Assert.NotNull(result);
}
我有一个直觉,当在测试模式下运行时,映射器不会查看我在Global.asax中设置的映射器配置.因为错误只在执行单元测试时发生,而是在运行网站时才发生.我已经创建了一个IMappaer接口作为DI,所以我可以模拟它进行测试.我使用Moq for Mocking和xUnit作为测试框架,我还安装了我还没有使用的AutoMoq.任何想法?谢谢你看我的冗长的职位.希望有人可以帮忙,一直在抓我头上好几个小时,阅读很多帖子. 解决方法在您的测试中,您需要创建一个嘲笑版本的IMapper界面,否则您不是单元测试,您正在进行集成测试.那么你只需要做一个简单的mockMapper.Setup(m => m.Map(something,somethingElse)).Returns(anotherThing).如果要在测试中使用真正的AutoMapper实现,那么您需要首先进行设置.您的测试不会自动接收您的Global.asax,您也必须在测试中设置映射.当我进行集成测试时,我通常会在测试夹具设置中调用一个静态AutoMapperConfiguration.Configure()方法.对于NUnit,这是[TestFixtureSetUp]方法,我认为xUnit你只是把它放在构造函数中. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – 在MVC视图中使用条件编译符号
- .net – 实体单位工作和存储库模式的好处
- asp.net – 在开发,分段和生产环境之间区分web.config
- asp.net-mvc-3 – ASP.NET MVC – 防止Ajax.ActionLinks上的
- asp.net-mvc – 在IIS Express上设置SMTP
- asp.net-mvc – 从传递给局部视图的嵌套复杂对象获取值
- asp.net-mvc – 重定向到操作,需要传递数据
- 为什么我不能在ASP.net MVC中使用服务器控件?
- asp.net-mvc – 避免在Web Publish上删除文件夹
- asp.net三层架构增删改查
- asp.net-mvc – ASP.NET MVC – Elmah不工作,返回
- asp.net – DotLess的“web”属性究竟做了什么?
- asp.net – UserControl有IsPostBack,但是Contro
- 使用ASP.NET MVC 3和实体框架4.1代码首先在SQL C
- asp.net – 如何在没有文件扩展名的情况下制作AS
- asp.net-mvc – 使用LINQ to SQL在ASP.NET MVC中
- 休息 – 无法序列化内容类型的响应正文
- asp.net-mvc – 如何将asp.net mvc集成到Web站点
- asp.net-mvc-3 – ASP.NET MVC视图模型不绑定在H
- asp.net – 在成功登录时添加声明并在应用程序的
