Как выполнить модульное тестирование методов в объекте метода? - PullRequest
6 голосов
/ 07 мая 2010

Я выполнил рефакторинг " Заменить метод на объект метода ", описанный Beck .

Теперь у меня есть класс с "run ()"метод и набор функций-членов, которые разбивают вычисления на более мелкие единицы.Как мне проверить эти функции-члены?

Моя первая идея состоит в том, что мои модульные тесты в основном являются копиями метода "run ()" (с разными инициализациями), но с утверждениями между каждым вызовом функций-членов дляпроверить состояние вычислений.

(я использую Python и модуль unittest.)

class Train: 

    def __init__(self, options, points): 
        self._options = options 
        self._points = points 
        # other initializations

    def run(self): 
        self._setup_mappings_dict() 
        self._setup_train_and_estimation_sets() 
        if self._options.estimate_method == 'per_class': 
            self._setup_priors() 
        self._estimate_all_mappings() 
        self._save_mappings() 

    def _estimate_all_mappings(): 
        # implementation, calls to methods in this class

    #other method definitions

У меня определенно есть ожидания относительно того, какими должны быть состояния атрибутов-членов дои после вызова различных методов в рамках реализации метода run().Должен ли я делать утверждения об этих «частных» атрибутах?Я не знаю, как еще провести юнит-тестирование этих методов.

Другой вариант заключается в том, что мне действительно не следует их тестировать.

Ответы [ 2 ]

10 голосов
/ 08 мая 2010

Я отвечу на свой вопрос. После небольшого чтения и размышлений, я считаю, что я не должен быть модульным тестированием этих частных методов. Я должен просто проверить публичный интерфейс. Если частные методы, выполняющие внутреннюю обработку, достаточно важны для независимого тестирования и не являются просто совпадениями текущей реализации, то, возможно, это признак того, что они должны быть преобразованы в отдельный класс.

6 голосов
/ 28 сентября 2010

Мне нравится твой ответ, но я не согласен.

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

У вас возникает проблема зависимости от других ресурсов (что может быть или не быть правдой в этом случае).

Вы должны быть в состоянии использовать какую-то форму ioc, чтобы внедрить какую-то форму насмешки для изоляции класса.

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

...