単体テスト用の Moles フレームワークを学習しています。AccountController を使用したテンプレート ASP MVC プロジェクトがあり、テストしたいメソッドは Register() です
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, false, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
string confirmationGuid = Membership.GetUser(model.UserName).ProviderUserKey.ToString();
string confirmUrl = System.Web.HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) +
"/account/confirm?id=" + confirmationGuid;
var message = new MailService.MessageModel
{
UserName = model.UserName,
MessageSubject = "Registration confirmation",
MessageBody = "Please follow the link below in order to activate your account:\n" + confirmUrl
};
MailService.SendConfrimationEmail(message);
return RedirectToAction("Confirmation", "Account");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
return View(model);
}
静的メソッドに依存しますMembership.CreateUser
。テスト方法は次のようになります。
[TestMethod()]
[HostType("Moles")]
public void RegisterTest()
{
using (MolesContext.Create())
{
var target = new AccountController();
var model = new RegisterModel
{
UserName = "TestUser1",
Password = "12345678",
ConfirmPassword = "12345678",
Email = "mail@mail.com"
};
target.Register(model);
var exists = Membership.GetUser("TestUser1") != null;
Assert.IsTrue(exists);
}
}
Molesフレームワークがメソッド内の静的メソッドをモックすることを期待していますRegister
が、デバッグ中にcreateStatus
常にInvalidAnswer
値があることがわかり、テストが失敗しました。インターフェイスやデリゲートを手動で作成せずに Moles フレームワークを使用してこれを達成するにはどうすればよいですか?