2013-12-09 2 views
2

Скажем, я использую абстрактный класс библиотеки в качестве основы для моего абстрактных базового класса, такмодульного тестирование - Mocking/подавление __init__ объекта

class LibBaseClass(): 

    some_var = None # In any non-abstract versions of this class, this must be set 

    def __init__(self): 
     if some_var is None: 
      raise ImproperlyConfigured("some_var Not set!") 

Теперь у меня есть свой базовый класс, который использует этот класс ...

class MyBaseClass(LibBaseClass(): 

    some_var = None # Still None, doesn't make sense for this var to be set to anything 

    def my_additional_method(self): 
     .... 

Теперь, когда я пришел, чтобы испытать MyBaseClass, в методе setUp(), я хочу, чтобы инициализировать класс, так:

my_class = MyBaseClass() 

, но, конечно, это вызовет ошибку из базового класса библиотеки init(). Я ищу самый опрятный путь вокруг этой проблемы, но я не совсем уверен, что насмехается. Ошибка не важна/не будет влиять на какие-либо тесты, которые я пишу и запускаю, поэтому мне просто нужен способ обойти эту конкретную ошибку.

+0

Значит ли '__init__' сделать что-нибудь еще, кроме проверки для этого вар? –

+0

Нет, это просто как «Эй, ты не правильно настроил свой класс ребенка». – ptr

ответ

1

Я думаю, что у вас есть проблемы дизайна здесь:

some_var = None # In any non-abstract versions of this class, this must be set

some_var = None # Still None, doesn't make sense for this var to be set to anything

Те два утверждение противоречат друг другу. Итак, вы должны установить some_var или прекратить отменять исключение, если оно не установлено. Кроме того, если MyBaseClass должен быть абстрактным, вы не должны его создавать.

EDIT:

Однако, если вы действительно знаете, что вы делаете, вы можете легко бросить родителей __init__:

MyBaseClass.__init__ = lambda self: None

+0

Я согласен, что это дефект дизайна, я обычно не помещал бы ошибку конфигурации в метод __init__, но скорее имею его в методе, где это требуется. Что я должен установить 'some_var' в моем классе child-yet-still-abstract? Чтобы добавить небольшой контекст, 'some_var' - это шаблон html-файла для рендеринга. MyBaseClass никогда не будет использоваться как автономный, поэтому для него не имеет смысла иметь шаблон. – ptr

+1

Что-то думать о любом случае, я нашел это: http://blog.devork.be/2008/12/mocking-away-init-method.html Это также затрагивает проблему. – ptr

Смежные вопросы