Лучший способ протестировать методы экземпляра без запуска __init__ - PullRequest
3 голосов
/ 18 мая 2010

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

Вот проблема - я бы хотел, чтобы моя инфраструктура unittest напрямую вызывала закрытые методы, вызываемые init с разными данными, без прохождения init.

Какой лучший способ сделать это?

До сих пор я проводил рефакторинг этих классов, чтобы init делал меньше, а данные передавались отдельно. Это облегчает тестирование, но я думаю, что удобство использования класса несколько ухудшается.

РЕДАКТИРОВАТЬ: Пример решения на основе ответа Игнасио:

import types

class C(object):

   def __init__(self, number):
       new_number = self._foo(number)
       self._bar(new_number)

   def _foo(self, number):
       return number * 2

   def _bar(self, number):
       print number * 10

#--- normal execution - should print 160: -------
MyC = C(8)

#--- testing execution - should print 80 --------
MyC = object.__new__(C)
MyC._bar(8)

Ответы [ 2 ]

4 голосов
/ 18 мая 2010

Почему юзабилити класса должно пострадать? Если все, что делает __init__, это предварительные вычисления, то есть вы можете выставить значения в виде простых переменных, измените эти переменные на свойства и выполните вычисления (потенциально кэшированные / запомненные) в получателе. Таким образом, ваш метод __init__ возвращается к выполнению только инициализации и улучшается тестируемость.

Недостатком этого подхода является то, что может быть менее производительным, но, вероятно, не в значительной степени.

3 голосов
/ 18 мая 2010

Для классов нового стиля вызовите object.__new__(), передав класс в качестве параметра. Для классов старого стиля вызовите types.InstanceType(), передав класс в качестве параметра.

import types

class C(object):
  def __init__(self):
    print 'init'

class OldC:
  def __init__(self):
    print 'initOld'

c = object.__new__(C)
print c

oc = types.InstanceType(OldC)
print oc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...