Mock eine Klasse in Python, um eine seiner Methoden aufzurufen

8

Ich fange an, Python zu lernen, und gleichzeitig versuche ich, Tests für meinen Code zu schreiben. Ich habe mich dafür entschieden, py.test und mock dafür zu verwenden. Ich habe eine ziemlich große und komplexe Klasse bekommen, um Tests zu schreiben, also habe ich mich anfangs für ein einfacheres Beispiel entschieden.

Also, ich habe eine sehr einfache Klasse geschrieben ( person.py in einem Paket namens src_pkg )

%Vor%

Was ich tun möchte, ist die Person-Klasse zu verspotten und eine Instanz der mocked-Klasse zu erstellen, um die Methode can_do_it() aufrufen zu können.

Der Grund, warum ich das machen möchte, ist, dass die reale Klasse, an der ich arbeite, einen wirklich komplexen Konstruktor hat, und ich möchte keine Instanz der Klasse erstellen, indem ich etwas wie foo = Foo(x, y, z)

Also, ich habe meinen Testcode geschrieben ( test_person.py in einem Paket namens test_pkg ), welches das Folgende ist:

%Vor%

aber wenn ich renne:

%Vor%

Ich bekomme folgendes Ergebnis:

%Vor%

Ich würde erwarten, dass der Ausdruck print "can he do it? :", person.can_do_it(4) zu can he do it? : False führt. Daher hat es keinen Sinn etwas zu behaupten.

Ich denke, wenn ich den Test starte, wird die Methode can_do_it() überhaupt nicht aufgerufen! (Ansonsten würde die print-Anweisung der Methode gedruckt, oder?)

Also, was mache ich falsch?

Jede Hilfe würde wirklich geschätzt werden.

Vielen Dank im Voraus.

    
kostasg 14.02.2014, 05:54
quelle

2 Antworten

5

Patche die Methode __init__ mit mock.patch.object :

%Vor%     
falsetru 14.02.2014, 06:00
quelle
1

Ein Mock-Objekt hat Mock-Methoden, nicht die echten Methoden. Die echten Methoden können davon abhängen, dass Sie ein echtes, vollständig konstruiertes Objekt der richtigen Klasse als self haben, das ein Mock-Objekt nicht bereitstellen kann. Wenn Sie die can_do_it -Methode testen müssen, können Sie keinen Mock Person dafür verwenden.

Wenn can_do_it nicht davon abhängig ist, dass ein vollständig erstelltes self verfügbar ist, können Sie die Implementierung in eine Funktion auf Modulebene oder eine statische Methode verschieben und die Instanzmethode aufrufen:

%Vor%

Dann können Sie einfach die Modulebenenfunktion testen. Wenn Sie bestimmte Teile eines Person benötigen, aber Sie müssen nicht das Ganze konstruieren, dann können Sie einfach die Bits und Stücke konstruieren (oder mock) und die Modulebene-Funktion als Argumente verwenden lassen.

Wenn can_do_it davon abhängt, ob Sie ein reales self oder das meiste davon haben, müssen Sie möglicherweise ein echtes Person -Objekt konstruieren und die Methode aufrufen.

    
user2357112 14.02.2014 06:02
quelle

Tags und Links