タイトルはあまり具体的ではありませんが、例を挙げてみましょう。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" });
}
}