2015-09-02 20 views
8

Ich versuche, einige Unittests für eine Klasse zu schreiben, die von einem anderen abgeleitet ist, aber ich habe einige Schwierigkeiten der übergeordneten Klasse init Methode zu verspotten, die afaik Sie können nicht, so ich suche Vorschlag .Mock Elternklasse __init__ Methode

Hier ist ein Beispiel dafür, wie sind meine Klassen

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") 

In meiner Unittests I will das verifizieren Parent.parent_list == ["PARENT", "DERIVED"], wenn ich ein Objekt aus der Derived-Klasse Derived() instanziiere.

funktioniert

test_Derived.py Beide dieser Lösung nicht

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 mit

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

test_init_002 nicht mit

ImportError: No module named Parent.Imported 

Alle s nicht Uggestion?

+1

Warum genau funktioniert 'Eltern .__ init__' verspottet werden? Warum nicht einfach "Importiert" vortäuschen? –

+0

Ihr zweiter Test muss "Parent.Imported" vortäuschen. –

+1

Zu guter Letzt haben Sie 'Parent.parent_list' * in place * geändert, sodass sich sowohl 'Parent.parent_list' als auch' Derived.parent_list' auf dasselbe Objekt beziehen. Also 'Parent.parent_list' enthält jetzt" "Derived" ". Wahrscheinlich möchten Sie stattdessen eine Kopie für "Derived" erstellen: 'parent_list = Parent.parent_list + [" DERIVED "]'. Ihre Tests könnten dies überprüfen. –

Antwort

8

Für die erste Lösung ändern Sie den Rückgabewert der __init__ Methode zu 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"]) 

Für die zweite Lösung, Patch 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"]) 
Verwandte Themen