2012-01-06 4 views
2

Я пытаюсь использовать TDD при написании класса, который должен анализировать XML-документ. Предположим, что класс называется XMLParser, а его конструктор принимает строку для пути к XML-файлу для разбора. Я хотел бы иметь метод Load(), который пытается загрузить этот XML в память и выполняет несколько проверок в файле, таких как ошибки файловой системы, независимо от того, является ли файл XML и т. Д.Альтернативы тестированию частных методов в TDD

Мой вопрос: об альтернативах: я читал, что это плохая практика, чтобы иметь частные методы, которые вам нужно протестировать, и что вы должны просто проверить открытый интерфейс и позволить частным методам делать свою работу. Но в этом случае эта функциональность очень важна, и я не думаю, что она должна быть общедоступной.

У кого-нибудь есть хороший совет для такого сценария?

ответ

3

Предлагаю немного изменить архитектуру. В настоящее время у вас есть один класс высокого уровня с встроенной функциональностью с низким уровнем. Разделите это на несколько классов, принадлежащих к разным слоям (здесь я использую термин «слой»).

Пример:

  1. Есть один класс с общедоступным интерфейсом вашего текущего класса. (-> слой высокого уровня)
  2. Есть один класс, отвечающий за загрузку файлов с диска и обработки ошибок ввода-вывода (-> Низкий уровень слоя)
  3. Пусть один класс, отвечающий за проверку достоверности XML-документов (-> Inbetween)

Теперь вы можете проверить все три этих класса самостоятельно!

Вы увидите, что ваш класс высокого уровня будет не намного больше, чем просто составление двух классов нижнего уровня.

+0

Спасибо, Дэниэл. Можете ли вы подробно остановиться на # 1? Мне нравится идея перетащить № 2 и №3 эти задачи в тестируемые, но отдельные классы. – Monochrome

+0

@Monochromatic: Я не совсем понимаю вопрос в вашем комментарии. Эти три момента не являются «ни-либо» или «вариантами», вам нужно использовать их вместе. Сказав это, что не ясно с первого шага? –

1

Не используйте модификатор доступа (который является следующим до частного) и записывайте тест в том же пакете.

Хорошее OOD важно, но для действительно важного тестирования функциональности важнее. Хорошая практика всегда является лишь ориентиром, и они хороши в общем сценарии.

Вы также можете попытаться инкапсулировать это конкретное поведение проверки файлов в другом объекте и создать его синтаксический анализатор и использовать его. Вероятно, это то, что я сделал бы. Таким образом, вы могли бы даже использовать эту функциональность где-то еще с минимальными усилиями.

0

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

Public class TestableClass : MyClass 
{ 
    public someReturnType TestMethod() { 
     return base.PrivateMethod(); 
    } 
} 
Смежные вопросы