Контроллер юнит-теста - ошибка членства - PullRequest
1 голос
/ 02 октября 2011

Я хочу создать модульный тест для следующего контроллера, но в классе 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);

Пожалуйста, помогите мне заставить этот код работать.

1 Ответ

1 голос
/ 02 октября 2011

Кажется, что вы используете конкретные экземпляры IMembershipServive и IFormsAuthenticationService, потому что вы используете Accessor для их инициализации.Когда вы используете конкретные классы, вы на самом деле не тестируете этот класс изолированно, что объясняет проблемы, с которыми вы сталкиваетесь.

Что вы действительно хотите сделать, это проверить логику контроллера, а не функциональность других служб.

К счастью, это легко исправить, потому что MembershipService и FormsService являются открытыми членами контроллера и могут быть заменены имитационными реализациями.

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

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

Теперь вы можете протестировать несколько сценариев для вашего контроллера:

  • Что происходит, когда MembershipService не находит пользователя?
  • Пароль недействителен?
  • Пользователь и пароль действительны?

Обратите внимание, что ваш AuthenticationServicePack также может вызвать проблемы, если у него есть дополнительные службы или зависимости.Возможно, вы захотите перенести это в свойство контроллера или, если для аутентификации требуется отдельный экземпляр, рассмотрите возможность использования фабрики или другого сервиса для инкапсуляции этой логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...