2015-09-02 12 views
8

मैं एक वर्ग है जो एक और से ली गई है पर कुछ unittests लिखने के लिए कोशिश कर रहा हूँ, लेकिन मैं माता पिता के वर्ग init विधि उपहास करने के लिए है, जो 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") 

मेरी unittests में हैं मैं इसे सत्यापित करना चाहते हैं जब मैं व्युत्पन्न वर्ग, व्युत्पन्न() से किसी ऑब्जेक्ट को तुरंत चालू करता हूं तो माता-पिता.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

आपके दूसरे परीक्षण को 'माता-पिता' आयातित करने की आवश्यकता है। –

+1

अंतिम लेकिन कम से कम नहीं, आपने 'parent.arent_list' * को जगह * में संशोधित किया है, इसलिए दोनों' parent.parent_list' और 'derived.parent_list' एक ही ऑब्जेक्ट को संदर्भित करते हैं। इसलिए 'parent.arent_list' में अब' "सत्यापित" है। आप शायद इसके बजाय 'व्युत्पन्न' के लिए एक प्रति बनाना चाहते हैं: 'parent_list = parent.arent_list + [" DERIVED "]'। आपके परीक्षण इस के लिए जांचना चाह सकते हैं। –

उत्तर

8

पहले समाधान के लिए, None करने के लिए __init__ विधि की वापसी मान बदलें।

@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"]) 
संबंधित मुद्दे