2015-09-02 69 views
8

我想寫一些unittests從另一個派生類,但我有一些困難,嘲笑父類初始方法,這afaik你不能,所以我在尋找建議。模擬父類__init__方法

這裏的一個例子是如何我的班

Imported.py

class Imported(): 
    def __init__(self, a="I am Imported"): 
     print("a:{}".format(a)) 

Parent.py

from Imported import Imported 

class Parent(object): 

    parent_list = ["PARENT"] 

    def __init__(self, a="I am Parent"): 
     imported = Imported(a) 

Derived.py

from Parent import Parent 

class Derived(Parent): 

    Parent.parent_list.append("DERIVED") 

在我的單元測試我想驗證當我從派生類Derived()實例化一個對象時,Parent.parent_list == [「PARENT」,「DERIVED」]。

無論這種解決方案不起作用

test_Derived.py

import unittest 
from mock import patch 

from Derived import Derived 


class test_Derived(unittest.TestCase): 

    @patch("Derived.Parent.__init__") 
    def test_init_001(self, mock_parent_init): 
     a = Derived("I am Derived") 
     mock_parent_init.assert_called_with("I am Derived") 
     self.assertEquals(a.parent_list, ["PARENT", "DERIVED"]) 

    @patch("Derived.Imported.Imported") 
    def test_init_002(self, mock_parent_init): 
     a = Derived("I am Derived") 
     mock_parent_init.assert_called_with("I am Derived") 
     self.assertEquals(a.parent_list, ["PARENT", "DERIVED"]) 

test_init_001失敗

TypeError: __init__() should return None, not 'MagicMock' 

test_init_002失敗

ImportError: No module named Parent.Imported 

任何小號uggestion?

+1

爲什麼究竟init__'需要'父.__被嘲笑?爲什麼不只是嘲笑'進口'? –

+0

你的第二個測試需要模擬'Parent.Imported'。 –

+1

最後但並非最不重要的一點是,您修改了'Parent.parent_list' *到位*,因此'Parent.parent_list'和'Derived.parent_list'都指向同一個對象。所以'Parent.parent_list'現在包含'「DERIVED」'。您可能想要爲「派生」創建一個副本:'parent_list = Parent.parent_list + [「DERIVED」]'。你的測試可能要檢查這個。 –

回答

8

對於第一種解決方案,將__init__方法的返回值更改爲None

@patch("Derived.Parent.__init__") 
def test_init_001(self, mock_parent_init): 
    mock_parent_init.return_value = None # <--- 
    a = Derived("I am Derived") 
    mock_parent_init.assert_called_with("I am Derived") 
    self.assertEquals(a.parent_list, ["PARENT", "DERIVED"]) 

對於第二種方案,補丁Parent.Imported

@patch("Parent.Imported") # <--- 
def test_init_002(self, mock_parent_init): 
    a = Derived("I am Derived") 
    mock_parent_init.assert_called_with("I am Derived") 
    self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])