1

単体テスト用の 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 フレームワークを使用してこれを達成するにはどうすればよいですか?

4

1 に答える 1

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;
};
于 2012-07-17T01:22:31.873 に答える