2016-07-05 9 views
8

Ich habe eine Python-Datei a.py, die zwei Klassen A und B enthält.Python gibt MagicMock-Objekt anstelle von return_value zurück

class A(object): 
    def method_a(self): 
     return "Class A method a" 

class B(object): 
    def method_b(self): 
     a = A() 
     print a.method_a() 

würde Ich mag Bmethod_b in der Klasse Unittest durch A spöttisch. Hier ist der Inhalt der Datei testa.py für diesen Zweck:

import unittest 
import mock 
import a 


class TestB(unittest.TestCase): 

    @mock.patch('a.A') 
    def test_method_b(self, mock_a): 
     mock_a.method_a.return_value = 'Mocked A' 
     b = a.B() 
     b.method_b() 


if __name__ == '__main__': 
    unittest.main() 

Ich erwarte, dass Mocked A in der Ausgabe zu erhalten. Aber was ich bekomme ist:

<MagicMock name='A().method_a()' id='4326621392'> 

Wo mache ich mich falsch?

+1

Beim Testen gibt 'A()' den 'return_value' von' mock_A' zurück (ein regulärer 'MagicMock', da Sie nichts anderes angegeben haben), was keine Instanz der Klasse' A' ist. Sie müssen diesen 'return_value' so einstellen, dass er eine definierte' method_a' hat. – jonrsharpe

+1

mock_a.method_a.return_value = 'Mocked A' => Mock_a(). Method_a.return_value = 'Mocked A' sollte besser sein :) –

+0

@AliSAIDOMAR ist genau richtig, es ist der Rückgabewert von Aufruf 'Mock_a', die die haben sollte Methode, nicht "Mock_a" selbst. – jonrsharpe

Antwort

7

Wenn Sie @mock.patch('a.A') eingeben, ersetzen Sie die Klasse A im getesteten Code durch .

In B.method_b Sie setzen dann a = A(), die a = mock_a() ist jetzt - das heißt a die return_value von mock_a ist. Da Sie diesen Wert nicht angegeben haben, handelt es sich um einen normalen MagicMock; Dies ist auch nicht konfiguriert, so erhalten Sie die Standardantwort (noch eine MagicMock) beim Aufrufen von Methoden darauf.

Stattdessen möchten Sie die return_value von mock_a konfigurieren Sie die entsprechende Methode haben, die Sie entweder tun können:

mock_a().method_a.return_value = 'Mocked A' 
    #^note parentheses 

oder vielleicht deutlicher:

mock_a.return_value.method_a.return_value = 'Mocked A' 

Ihre Code hätte in dem Fall funktioniert a = A (Zuweisung der Klasse, nicht eine Instanz erstellen), als dann hätte a.method_a() Ihre Mock-Methode ausgelöst.

Verwandte Themen