【发布时间】:2011-05-31 07:18:04
【问题描述】:
我正在尝试编写一个单元测试来创建新用户并验证是否发生了所需的重定向。这是我的Register 操作,它几乎是来自 VS 模板的开箱即用代码:
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError(String.Empty, ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
以下是我的测试,使用起订量。无论我设置什么,我总是会从默认的MembershipCreateStatus 错误消息之一中收到错误消息。例如:
提供的密码无效。请输入有效的密码值
或
提供的密码找回答案无效
我尝试将CreateUser 方法更改为仅调用用户名、密码和电子邮件过载,但这并不重要。就像在某处执行密码策略的检查一样。
public void RegisterPost_WithAuthenticatedUser_RedirectsToHomeControllerIfSuccessful()
{
// Arrange
var accountController = new AccountController();
var mockContext = GetMockRequestContext();
ControllerContext controllerContext = new ControllerContext(mockContext.Object, accountController);
accountController.ControllerContext = controllerContext;
RegisterModel registerModel = new RegisterModel() { UserName = "someone", Email = "someone@example.com", Password = "user", ConfirmPassword = "password" };
// Act
var result = accountController.Register(registerModel);
// Assert
Assert.That(result.RouteData.Values["Controller"], Is.EqualTo("Home"));
Assert.That(result.RouteData.Values["Action"], Is.EqualTo("Index"));
}
谁能告诉我这里发生了什么?
【问题讨论】:
-
你的
GetMockRequestContext()怎么样? -
@abatishchev 我的朋友指出我正在测试 ASP.NET 中已经测试过的内部组件,所以我正在改变我的测试方法。但它看起来像这样:
Mock<RequestContext> GetMockContext(string roleName, bool isInRole, bool isAuthenticated){ var mockContext = new Mock<RequestContext>(); var fakeUser = new Mock<IPrincipal>(); fakeUser.Setup(p => p.IsInRole(roleName)).Returns(isInRole); fakeUser.Setup(p => p.Identity.IsAuthenticated).Returns(isAuthenticated); mockContext.Setup(c => c.HttpContext.User).Returns(fakeUser.Object);}
标签: c# unit-testing asp.net-mvc-3 tdd moq