标题不是很具体,但让我们使用示例。我们有 ASP.NET MVC 操作代码:
[HttpPost]
[ExportModelStateToTempData]
public RedirectToRouteResult ChangePassword(int id, UserChangePasswordVM changePassword)
{
if (ModelState.IsValid)
{
var user = _userService.GetUserByID(id);
//Checking old password. Administrators can change password of every user,
//providing his password instead of user's old password.
bool oldPasswordIsCorrect = _loginService.CheckPassword(
CurrentPrincipal.IsInRole(CTRoles.IsAdmin) ?
CurrentPrincipal.User.UserName : user.UserName,
changePassword.OldPassword);
if (oldPasswordIsCorrect)
{
TempDataWrapper.Message =
_userService.ChangePassword(user.UserName, changePassword.NewPassword) ?
CTRes.PasswordChangedSuccessfully : CTRes.ErrorProcessingRequest;
}
else
{
ModelStateWrapper.AddModelError("ChangePassword.OldPassword",
CTRes.CurrentPasswordIsNotValid);
}
}
return RedirectToAction(ControllerActions.Edit, new { id });
}
这是一种简单的方法。它需要用户 id 和密码更改表单的视图模型。如果模型状态有效,它会从服务层检索用户并调用函数来检查他的旧密码。管理员不必提供用户的旧密码,自己的就足够了。如果密码正确,则调用更改用户密码的函数。在成功或失败的情况下,适当的消息被放置在 TempData 中。操作以重定向到用户编辑页面结束,其中包含更改密码的表单并显示所有错误。
我有几个问题:
- 这段代码应该测试什么?
- 代码中的 if 语句很少。你会为每个场景编写一个测试吗?
- 您在控制器中测试什么?
代码中使用的接口和类(实现是在构造函数中注入的,但没关系):
public interface IModelStateWrapper
{
void AddModelError(string name, string error);
bool IsValid { get; }
}
public interface IUserService
{
User GetUserByID(int id);
bool ChangePassword(string userName, string newPassword);
}
public interface ILoginService
{
bool CheckPassword(string userName, string password);
}
public interface ITempDataWrapper
{
string Message { get; set; }
}
public class UserChangePasswordVM : IValidatableObject
{
[DataType(DataType.Password)]
public string OldPassword { get; set; }
[DataType(DataType.Password)]
public string NewPassword { get; set; }
[DataType(DataType.Password)]
public string NewPasswordConfirmation { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (string.IsNullOrEmpty(NewPassword))
yield return new ValidationResult(CTRes.PasswordNotEmpty, new[] { "NewPassword" });
if (string.IsNullOrEmpty(NewPasswordConfirmation))
yield return new ValidationResult(CTRes.ConfirmPassword, new[] { "NewPasswordConfirmation" });
if (NewPassword != null)
if (!NewPassword.Equals(NewPasswordConfirmation))
yield return new ValidationResult(CTRes.PasswordsDontMatch, new[] { "NewPasswordConfirmation" });
}
}