Specflow с проблемой проверки модели MVC - PullRequest
0 голосов
/ 26 мая 2011

Я использую Specflow, nunit и moq для проверки регистрации приложения MVC2 по умолчанию при изучении SpecFlow.

У меня есть следующие шаги для проверки, если имя пользователя и пароль не были введены.

Steps

[Given(@"The user has not entered the username")]
        public void GivenTheUserHasNotEnteredTheUsername()
        {   
            _registerModel = new RegisterModel
            {
                UserName = null,
                Email = "test@dummy.com",
                Password = "test123",
                ConfirmPassword = "test123"
            };      
        }

[Given(@"The user has not entered the password")]
        public void GivenTheUserHasNotEnteredThePassword()
        {
            _registerModel = new RegisterModel
            {
                UserName = "user" + new Random(1000).NextDouble().ToString(),
                Email = "test@dummy.com",
                Password = string.Empty,
                ConfirmPassword = "test123"
            };  
        }

[When(@"He Clicks on Register button")]
        public void WhenHeClicksOnRegisterButton ()
        {
            _controller.ValidateModel(_registerModel);
            _result = _controller.Register(_registerModel);
        }

[Then(@"He should be shown the error message ""(.*)""  ""(.*)""")]
        public void ThenHeShouldBeShownTheErrorMessage(string errorMessage, string field)
        {
            Assert.IsInstanceOf<ViewResult>(_result);
            var view = _result as ViewResult;
            Assert.IsNotNull(view);
            Assert.IsFalse(_controller.ModelState.IsValid);
            Assert.IsFalse(view.ViewData.ModelState.IsValidField(field));
            Assert.IsTrue(_controller.ViewData.ModelState.ContainsKey(field));          

            Assert.AreEqual(errorMessage,
            _controller.ModelState[field].Errors[0].ErrorMessage);
        }

Метод расширения для принудительной проверки

public static class Extensions
    {
        public static void ValidateModel<T> ( this Controller controller, T modelObject )
        {
            if (controller.ControllerContext == null)
                controller.ControllerContext = new ControllerContext();

            Type type = controller.GetType();
            MethodInfo tryValidateModelMethod =
                type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).Where(
                    mi => mi.Name == "TryValidateModel" && mi.GetParameters().Count() == 1).First();

            tryValidateModelMethod.Invoke(controller, new object[] { modelObject });
        }
    }`

Я не понимаю, почему в следующих строках не проходит тест на отсутствие пароля.

    Assert.IsFalse(view.ViewData.ModelState.IsValidField(field));
    Assert.IsTrue(_controller.ViewData.ModelState.ContainsKey(field));

Я заметил, что возвращаемое сообщение об ошибке не совпадает с паролем и паролем ConfirmPassword, но я не понимаю, почему для всех других тестов, включая тест на отсутствие пароля для подтверждения (идентичный тесту на отсутствующий пароль), они работают нормально.

Есть идеи?

Особенности

  • Сценарий: регистр должен выдавать ошибку, если имя пользователя отсутствует
  • Подарено Пользователь не ввел имя пользователя
  • Когда он нажимает кнопку регистрации
  • Тогда ему должна быть показана ошибка сообщение "Поле имени пользователя обязательно." "Имя пользователя"

  • Сценарий: регистр должен выдавать ошибку, если пароль отсутствует

  • Дано Пользователь не вошел в пароль
  • Когда он нажимает кнопку регистрации
  • Тогда ему должно быть показано сообщение об ошибке «Пароль должен быть хотя бы Длина 6 символов. "" Пароль "

UPDATE Хорошо, кажется, атрибут ValidatePasswordLengthAttribute в модели учетной записи не может инициализировать Membership.Provider, поскольку в моем app.config не было строки подключения. Pembership.Provider подключается к членской базе данных сейчас?

Я добавил строку подключения, но теперь тест проходит 50% времени, поскольку он возвращает две ошибки:

  • Требуется пароль
  • Пароль должен быть длиной 6 символов.

Проблема заключается в том, что они не возвращаются в одном и том же порядке каждый раз, поэтому проверка является нестабильной. Как я могу переписать свой сценарий и протестировать это? Могу ли я сохранить один метод «Тогда» или мне нужно создать новый метод?

Спасибо.

1 Ответ

0 голосов
/ 26 мая 2011

Мне пришлось добавить строку подключения AccountService в App.config, который использует nunit. Это приводило к ошибке в ValidatePasswordLengthAttribure.

Я обновил Assert, который проверяет правильное сообщение об ошибке:

Assert.AreEqual(errorMessage, 
            _controller.ModelState[field].Errors.First(e => e.ErrorMessage == errorMessage).ErrorMessage);

Все еще не уверены в том, что членство в членстве поражает БД

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