Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2014, 22:35   #1
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию Модульное тестирование для свойств (UNIT TEST))

Ребят, подскажите пожалуйста что я делаю не так и как тестировать на min max
Вот свойство которое тестирую

Код:
// <summary>
        /// Поле, описывающее параметр ширины фундамента
        /// </summary>
        private double _foundationWidth;
 
        /// <summary>
        /// Свойство, реализующее поле _foundationWidth
        /// </summary>
        public double FoundationWidth
        {
            get { return _foundationWidth; }
            set
            {
                if ((value <= 80) && (value >= 60)) //определяю Max и Min для значения value
                {
                    if (value >= 4*_foundationHeight) //задаю для value больше _foundationHeight в 4 раза
                    {
                        _foundationWidth = value; 
                    }
                    else
                    {
                        var exp = new ArgumentException(); //ловлю ошибку для второго случая
                        throw exp;
                    }
                }
                else
                {
                    var ex = new ArgumentOutOfRangeException(); //ловлю ошибку для min max
                    throw ex;
                }
            }
        }
Хочу протестировать отлавливает ArgumentException в свойстве то, что значение value в 4 раза больше _foundationHeight и ArgumentOutOfRangeException то что не может выйти за рамки min max. Т.е. нужно нужно проверить действительно ли он выдаст сообщение в случае этих ошибок.
Вот мой говнотест
Код:
/// <summary>
        /// Тестовые данные для ширины фундамента
        /// </summary>
        [TestMethod]
        public void TestWidthFoundationArgument()
        {
            var grateDescription = new GrateDiscription();  //создаю экземпляр класса в которо лежат как раз таки FoundationWidth и FoundationHeight
            var actual = grateDescription.FoundationWidth;
            var actualArg = 4*grateDescription.FoundationHeight;
            try
            {
                grateDescription.FoundationWidth = 60;
                grateDescription.FoundationHeight = 15;
            }
            catch (ArgumentOutOfRangeException ex)
            {
                //не могу понять как проверить не выходит ли значение за пределы min max
            }
            catch (ArgumentException)
            {
                Assert.Equals(actual, actualArg);
            }
          
            Assert.Fail("No exception was thrown."); //еще и здесь ошибку выдает :(
        }
Я сделал так, но говорят что так не верно + ошибку для Fail выдает
Cill вне форума Ответить с цитированием
Старый 23.12.2014, 22:56   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

есть атрибут ExpectedException, который требует от теста исключение.
итого имеем, например:
Код:
        [TestMethod]
        [ExpectedException(typeof(ArgumentOutOfRangeException))]
        public void TestForArgumentOutOfRangeException()
        {
            var grateDescription = new GrateDiscription();  
            grateDescription.FoundationWidth = 40;//даем заведомо неверный аргумент, должен выбросить исключение.
        }
этот тест сфейлится если исключения не будет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.12.2014, 23:03   #3
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию

спасибо. Ща попробую
получается для ArgumentException будет
Код:
[TestMethod]
        [ExpectedException(typeof(ArgumentException))]
        public void TestForArgumentException()
        {
            var grateDescription = new GrateDiscription();  
            grateDescription.FoundationWidth = 40;//даем заведомо неверный аргумент, должен выбросить исключение.
             grateDescription.FoundationHeight = 1;
        }
Cill вне форума Ответить с цитированием
Старый 23.12.2014, 23:13   #4
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию Не, мой вариант че то не работает

Цитата:
Сообщение от Cill Посмотреть сообщение
спасибо. Ща попробую
получается для ArgumentException будет
Код:
[TestMethod]
        [ExpectedException(typeof(ArgumentException))]
        public void TestForArgumentException()
        {
            var grateDescription = new GrateDiscription();  
            grateDescription.FoundationWidth = 40;//даем заведомо неверный аргумент, должен выбросить исключение.
             grateDescription.FoundationHeight = 1;
        }
В этом случае фэйлится на grateDescription.FoundationWidth = 40
Cill вне форума Ответить с цитированием
Старый 23.12.2014, 23:18   #5
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию Как проверить второй случай?

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
есть атрибут ExpectedException, который требует от теста исключение.
итого имеем, например:
Код:
        [TestMethod]
        [ExpectedException(typeof(ArgumentOutOfRangeException))]
        public void TestForArgumentOutOfRangeException()
        {
            var grateDescription = new GrateDiscription();  
            grateDescription.FoundationWidth = 40;//даем заведомо неверный аргумент, должен выбросить исключение.
        }
этот тест сфейлится если исключения не будет.
Как проверить тогда этот эксепшн?
Код:
if (value >= 4*_foundationHeight) //задаю для value больше _foundationHeight в 4 раза
                    {
                        _foundationWidth = value; 
                    }
                    else
                    {
                        var exp = new ArgumentException(); //ловлю ошибку для второго случая
                        throw exp;
                    }
А в одном тесте по всей видимости оба случая никак не проверить?
Cill вне форума Ответить с цитированием
Старый 23.12.2014, 23:32   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
[TestMethod]
        [ExpectedException(typeof(ArgumentException))]
        public void TestForArgumentException()
        {
            var grateDescription = new GrateDiscription();  
             grateDescription.FoundationHeight = 30;
            grateDescription.FoundationWidth = 60;//даем заведомо неверный аргумент, должен выбросить исключение.
        }
Ну дык вам же надо чтоб зашел в ту ветку, соответственно объект нужно ввести в нужное состояние, в верном порядке

Тесты на исключения лучше проводить раздельно.
хотя объединить можно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.12.2014, 23:53   #7
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию

точно. на счет порядка то я че то не подумал, в дебри какие то сидел сейчас заморачивался
Cill вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
статья - Test-Driven Development для Java(TDD, разработка через тестирование) на практике. Pblog Обсуждение статей 0 16.06.2011 23:10
Unit-test фейлится Mira-girl Общие вопросы по Java, Java SE, Kotlin 3 20.01.2011 23:25
Unit test & C++ alex_alpha Общие вопросы C/C++ 0 04.07.2010 18:25