Ich verarbeite eine Sequenz von benutzerdefinierten Objekten. Es sieht ähnlich dem folgenden:Wie kann ich Aufrufe bestätigen, die Sequenzargumente mit Python Mock akzeptieren?
class Thing(object):
def __init__(self, x, y):
self.x = x
self.y = y
Die Methode, die ich zur Zeit testen bin hat eine ähnliche Funktionalität wie folgt zusammen:
def my_function(things):
x_calc = calculate_something(t.x for t in things)
y_calc = calculate_something(t.y for t in things)
return x_calc/y_calc
Das Problem, das ich bin vor, um die Anrufe zu calculate_something
testen. Ich möchte behaupten, dass diese Anrufe geschehen, so etwas wie so:
calculateSomethingMock.assert_any_call(the_sequence)
ich nicht über die Reihenfolge der Sequenz in calculate_something
vergangen ist es egal, aber ist mir egal, dass die Elemente alle vorhanden sind. Ich könnte die Generator-Funktion in einen Anruf zu set
wickeln, aber ich fühle mich nicht wie mein Test sollte diktieren, welche Art von Sequenz in calculate_something
übergeben wird. Ich sollte in der Lage sein, irgendeine Art von Sequenz zu übergeben. Ich könnte alternativ eine Methode erstellen, die die Sequenz generiert, anstatt Generatorsyntax zu verwenden und diese Methode vorzutäuschen, aber das scheint wie Overkill.
Wie kann ich diese Behauptung am besten strukturieren, oder ist mein Problem hier ein Hinweis auf schlecht strukturierten Code?
Ich benutze Python 2.7.3 mit Mock 1.0.1.
(Für alle, die gezwungen fühlt, sich dazu zu äußern, ich bin mir bewusst, ich Test letzte tue, und dass dies nicht die größte Praxis betrachtet wird.)
Edit:
Nach Uhr this marvelous talk entitled "Why You Don't Get Mock Objects by Gregory Moeck" Ich habe darüber nachgedacht, ob ich mich überhaupt über die Methode calculate_something
lustig machen sollte.
Ich versuche zu vermeiden, in diese Liste zu graben, aber ich nehme an, es könnte der einzige Weg sein. Können Sie ein Beispiel geben? – jpmc26
Danke. Dieser Test beruht auf der Methodenerhaltungsreihenfolge und beruht auch auf der Methode, die eine Liste übergibt. Ich bin nicht sehr scharf auf den Test, der auf Ordnung beruht. Wenn ich mich entscheide, zu einer anderen Datenstruktur für das in 'calculate_something' übergebene Argument zu wechseln, soll der Test fehlschlagen? Oder umgekehrt, wenn ich den Test ändere, um den Aufruf für einen anderen Datentyp zu überprüfen, möchte ich die Methode ändern müssen, um es erneut zu übergeben? – jpmc26
Ja, aber denken Sie daran, dies ist ein Beispiel. Sie können 'calcome_something' jede andere Datenstruktur übergeben, aktualisieren Sie einfach den Test, um das widerzuspiegeln (durch Ändern der erwarteten Werte). Sie möchten, dass der Test überhaupt besteht. Sie haben bereits gesehen, wie Sie die übergebenen Argumente mit 'call_args_list' an' calculate_something' übergeben können. Danach ist es nur eine Frage des Vergleichs der strukturierten Daten mit dem, was Sie erwarten. –