簡體   English   中英

單元測試控制器-成員資格錯誤

[英]Unit test controller - membership error

我想為以下控制器創建單元測試,但是在Membership類中失敗:

public class AccountController:BaseController
    {
        public IFormsAuthenticationService FormsService { get; set; }
        public IMembershipService MembershipService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if(FormsService == null) { FormsService = new FormsAuthenticationService(); }
            if(MembershipService == null) { MembershipService = new AccountMembershipService(); }

            base.Initialize(requestContext);
        }
        public ActionResult LogOn()
        {
            return View("LogOn");
        }

        [HttpPost]
        public ActionResult LogOnFromUser(LappLogonModel model, string returnUrl)
        {
            if(ModelState.IsValid)
            {
                string UserName = Membership.GetUserNameByEmail(model.Email);
                if(MembershipService.ValidateUser(model.Email, model.Password))
                {
                    FormsService.SignIn(UserName, true);

                    var service = new AuthenticateServicePack();
                    service.Authenticate(model.Email, model.Password);
                    return RedirectToAction("Home");
                }
            }
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
            return View("LogOn", model);
        }
    }

單元測試代碼:

[TestClass]
    public class AccountControllerTest
    {
        [TestMethod]
        public void LogOnPostTest()
        {
            var mockRequest = MockRepository.GenerateMock();
            var target = new AccountController_Accessor();
            target.Initialize(mockRequest);
            var model = new LogonModel() { UserName = "test", Password = "1234" };
            string returnUrl = string.Empty;
            ActionResult expected = null;
            ActionResult actual = target.LogOn(model, returnUrl);
            if (actual == null)
                Assert.Fail("should have redirected");

        }
    }

當我用谷歌搜索時,我得到了以下代碼,但是我不知道如何將成員身份傳遞給accountcontroller

var httpContext = MockRepository.GenerateMock();
                var httpRequest = MockRepository.GenerateMock();
                httpContext.Stub(x => x.Request).Return(httpRequest);
                httpRequest.Stub(x => x.HttpMethod).Return("POST");

                //create a mock MembershipProvider & set expectation
                var membershipProvider = MockRepository.GenerateMock();
                membershipProvider.Expect(x => x.ValidateUser(username, password)).Return(false);

                //create a stub IFormsAuthentication
                var formsAuth = MockRepository.GenerateStub();

            /*But what to do here???{...............
                ........................................
                ........................................}*/

                controller.LogOnFromUser(model, returnUrl);

請幫助我使此代碼正常工作。

似乎您正在使用IMembershipServive和IFormsAuthenticationService的具體實例,因為您正在使用訪問器對其進行初始化。 當您使用具體的類時,您並不是真正地在單獨測試該類,這可以解釋您所遇到的問題。

您真正想做的是測試控制器的邏輯,而不是其他服務的功能。

幸運的是,這很容易解決,因為MembershipService和FormsService是控制器的公共成員,可以用模擬實現替換。

// moq syntax:
var membershipMock = new Mock<IMembershipService>();
var formsMock = new Mock<IFormsAuthenticationService>();

target.FormsService = formsMock.Object;
target.MembershipService = membershipService.Object;

現在,您可以為控制器測試幾種方案:

  • 如果MembershipService找不到用戶怎么辦?
  • 密碼無效?
  • 用戶名和密碼是否有效?

請注意,如果AuthenticationServicePack具有其他服務或依賴項,也會引起問題。 您可能需要考慮將其移至控制器的屬性,或者如果每次身份驗證需要將其作為單個實例,則可以考慮使用工廠或其他服務來封裝此邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM