|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Пара вопросов по тестированию и рефакторингу
Здравствуйте, возникла необходимость сделать рефакторинг чужого кода + решил разобраться и освоить модульное тестирование.
В процессе возникло несколько вопросов: 1. DUnit; 1.1. Стандартный кодогенератор создает шаблон теста так, что если тестируешь класс, то на тест идут только public методы. Понятно, почему: методы тестирования работают с объектом класса, которому доступны только паблик методы. Но ошибки могут быть и в приватных методах, как быть? 1.2. Предположим, класс DBConnector содержит два метода (процедуры), которые инкапсулируют внутри множество методов. Код:
procedure GetAuthenticationData; procedure ConnectByDataBase; Т.е. после GetAuthenticationData изменяются поля класса и ConnectByDataBase использует эти значения для своей работы. Как тогда протестировать отдельно тот же ConnectByDataBase, которая работает с приватными полями класса? 2. Рефакторинг 2.1. Есть события formcreate, ontimer и часть других методов, которые отвечают за инициализацию данных и вызываются в разное время. Я так понимаю, лучшее решение воспользоваться паттерном "одиночка" и инициализировать данные как: singleton.getInstance.egg1,singleton.getInstance.e gg2 и т.д. ? 2.2. Обработка исключений на разных уровнях вложенности функций. Я просто запутался. Вот к примеру есть такая ситуация ( я сознательсно опускаю некоторые элементы синтаксиса: Код:
function A; begin try function B; except on ExceptionFromB end function B; begin try function C; //некоторый код, который поднимает исключение ExceptionFromB except on ExceptionFromC end function C; begin //некоторый код, который поднимает исключение ExceptionFromC end Bargest: оформляем код тегами [ code] [ /code]! Нормальная ли такая конструкция где в функции B и вызывается функция C и поднимается исключение, которое будет обработано на уровне функции А. + тут такая ситуация, что если будет поднято исключение ExceptionFromC, то даже в случае того, если будет поднято ExceptionFromB, будет обработано только ExceptionFromC на уровне функции B. Как тогда быть с обработкой исключения на уровне функции А ? А если я захочу поймав исключение на самом нижнем уровне прекратить выполнение всех функций? Заранее спасибо Последний раз редактировалось Bargest, 25.06.2012 в 20:51. |
#2
|
|||
|
|||
здесь некоторые даже не рекомендуют тестировать private методы
1.2 скорее всего надо разбивать на функции или вроде того; я изолированно не тестировал, может потому, что с тестами ещё не освоился; по идее тесты должны повышать качество кода, но для изоляции приходится всякие mock объекты использовать 2 я понимаю singleton, просто как способ сгруппировать глобальные переменные, функции 2.2 какое применение этих Exception-ов? Последний раз редактировалось Pyro, 25.06.2012 в 21:39. |
#3
|
|||
|
|||
Bargest, сорри, учту на будущее.
Блин, столько писал и меня выкинуло с аккаунта и все сообщения пропали, так как писал быстрое сообщение. Восстанавливаю Pyro 1) Гляну ссылку, спасибо Но тогда я не понимаю идеологии, если не тестировать приватные методы, то как быть с полями? Многие методы тесно связаны с полями класса. Как я могу тестировать публичный метод, который не принимает ни каких параметров, а работает со значениями приватных полей и методов? 2. Это понятно, просто сейчас в коде идет работа в oncreate, а потом в ontimer. Используются и локальные и глобальные переменные. Инкапсулировать все в синглетон мне не совсем нравится, так как эти переменные/функции будут нужны не везде. Сделать все в виде локальных переменных класса каждого обработчика тоже не вариант, так как я говорил работа взаимосвязана. Совместить все в обработчике одного события не представляется возможным. Я думал сделать два класса, один из которых будет работать с oncreate и результаты его работы будут передаваться в другой класс работы с ontimer, но по сути это один итот же класс и я исскуственно делю его сущность на две и это опять мне не совсем нравится 2.2. Т.е.? Просто есть структура: функция вызывает некоторый код и функцию, та функция в свою очередь некоторый код и функцию и т.д. во время выполнения каждой функции может сгенерироваться стандартное исключение, либо поднятое мною. Мне нужно пронести инфу об этом исключении по всем уровням, прекратив выполнение всех уровней и внешней функции. |
#4
|
|||
|
|||
Прочитал ссылку, вообщем-то понятно предложение делать эти методы защищенными и не тестировать методы доступа.
Но все равно это не решает проблемы, когда метод работает с приватными полями ( именно полями) и мы никак не можем выставить им значения так как мы тестируем именно МОДУЛЬНО, изолированно от других методов. |
#5
|
|||
|
|||
2.2 в обработке исключения можно сделать
Код:
raise ExceptionFromB.create //если не ошибаюсь Цитата:
по идее надо инкапсулировать в классы исходя из их ответственности(имён) Цитата:
|