2013-12-09 68 views
2

比方說,我使用的是庫的抽象類作爲我自己的抽象基類的基礎上,所以單元測試 - 嘲諷/抑制對象的__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應該是抽象的,你不應該實例化它。

編輯:

但是,如果你真的知道你在做什麼,你可以輕鬆地放下父__init__

MyBaseClass.__init__ = lambda self: None

+0

我同意這是一個設計缺陷,我通常不會像這樣在__init__方法中放置配置錯誤,而是將它放在需要的方法中。我應該怎樣在我的孩子 - 仍然抽象類中設置'some_var'來做什麼?要添加一個上下文,'some_var'是要呈現的html文件模板。 MyBaseClass永遠不會被用作獨立的,所以它沒有任何意義,它有一個模板。 – ptr

+1

無論如何要思考一下,我發現這個:http://blog.devork.be/2008/12/mocking-away-init-method.html這也涵蓋了這個問題。 – ptr