我正在学习单元测试的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框架而无需手动创建任何接口或委托来实现此目的?
答案 0 :(得分:1)
我终于找到了一种模拟Membership.CreateUser
方法的方法,虽然实现有点长。
MMembership.CreateUserStringStringStringStringStringBooleanObjectMembershipCreateStatusOut =
(string userName, string password, string email, string passwordQuestion,
string passwordAnswer, bool isApproved, object providerUserKey,
out MembershipCreateStatus @createStatus) =>
{
@createStatus = MembershipCreateStatus.Success;
return null;
};