Я унаследовал код с очень сложной инициализацией в конструкторе, который зависит от очень сложной среды.

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

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

Как бы я это сделал? Я посмотрел на насмешку, но, похоже, не могу передать фактическую функциональность класса в макет объекта.

ОБНОВЛЕНИЕ №1: Пример, чтобы попытаться прояснить, о чем я прошу

class Foo(object):
  def __init__(self, lots_of_stuff):
    lotsofthingsbeingdone()

class Bar(Foo):
  def core_functionality(self, something):
    val =  does_something_important(something)
    return val

Я хочу протестировать core_functionality (). Я хочу накормить его «чем-то» и убедиться, что val соответствует моим ожиданиям относительно того, каким он должен быть.

0
user3325789 19 Дек 2016 в 18:41
Если то, что вы хотите протестировать, можно протестировать без действительно сконструированного объекта, почему бы просто не вытащить их полностью из класса в вспомогательные функции, а затем протестировать их?
 – 
user2357112 supports Monica
19 Дек 2016 в 18:45
О - «У меня нет возможности прикоснуться к исходному коду» - я не уверен, что вы действительно можете сказать, что унаследовали его в этом случае, поскольку у вас нет возможности или обязанности поддерживать его, но это помешает любому рефакторингу.
 – 
user2357112 supports Monica
19 Дек 2016 в 18:46
Да вот в чем проблема. Я могу обойтись простым модульным тестированием некоторых частей, но есть некоторые основные функции, которые я хотел бы протестировать, которые я действительно не могу выполнять за пределами выделенной тестовой среды, которая предоставит все файлы, которые требуются конструктору. Поскольку в игре присутствует отвратительная иерархия наследования, я не могу извлекать вещи без серьезного рефакторинга или переписывания. Переходя от служебных обязанностей, есть ли способ просто получить пустой объект, чтобы я мог протестировать сложную функциональность, не обращаясь с просьбой о переписывании?
 – 
user3325789
19 Дек 2016 в 18:56
Вы тестируете класс или его потребителя? Что означает "не может получить реальную функциональность" ? Если вы издеваетесь над этим, вам не нужна реальная функциональность. Приведите, пожалуйста, менее абстрактный пример.
 – 
jonrsharpe
19 Дек 2016 в 19:06
@ user3325789: Предполагалось, что Bar унаследует от Foo в этом примере?
 – 
user2357112 supports Monica
19 Дек 2016 в 19:12

1 ответ

Лучший ответ

Используйте это с умом. Не усугубляйте устаревший беспорядок:

# No constructors executed.
empty_object = object.__new__(YourClass)
1
user2357112 supports Monica 19 Дек 2016 в 18:59
Большое спасибо, это решило мою проблему! Будет очень рассудительно!
 – 
user3325789
19 Дек 2016 в 19:19