Decorator mit Argument aufrufen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

zum Testen monatlicher Wiederholungen verwende ich folgendes

Code: Alles auswählen

marker = pytest.mark.parametrize('queries, expected')
@marker(weekday_scenario)
def test_monthly_recurrences(queries, expected):
    assert queries == expected
`weekday_scenario` besteht aus zwei Listen mit `datetime` Objekten, die jeweils übereinstimmen müssen. Soweit so gut. Nun habe ich neben `weekday_scenario` auch ein `monthday_scenario`. Wie kann ich beide getrennt voneinander testen?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Guten morgen,

ich muss Euch leider nochmals mit diesem Problem kommen... bin total blockiert! :?

Wie kann ich in meinem Beispiel dem Decorator `marker` verschiedene Argumente geben? Ich habe sowas versucht, was aber auch nicht klappt:

Code: Alles auswählen

marker = pytest.mark.parametrize('queries, expected')
def run(scenario):
    @marker(scenario)
    def test_(queries, expected):
        assert queries == expected

def test_run():
    run(weekday_scenario)
    run(monthday_scenario)
Ich steh' wie der Ochs' vorm Berg, weil ich zum einen mit Dekoratoren nicht wirklich klar komme und zum anderen (wahrscheinlich) kein gutes Konzept habe, wie ich mit `py.test` umgehen könnte. Letztlich möchte ich ja erstmal nur `datetime` Objekte links mit `datetime` Objekten rechts vergleichen...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Auch, wenn ich keine Ahnung habe, was Du vor hast ...

Dekoratoren sind, wie Du weißt, Funktionen, welche ausschließlich eine Funktion entgegen nehmen und als Ergebnis eine Funktion zurück geben:

Code: Alles auswählen

@g
def f(x):
    pass

# ist gleichbedeutend mit

def f(x):
    pass

f = g(f)
"Dekoratoren" mit Parametern, sind Funktionen, welche "echte" Dekoratoren zurückgeben:

Code: Alles auswählen

@g(x)
def f(y):
    pass

# ist gleichbedeutend mit

def f(y):
    pass

h = g(x)
f = h(f)
Diese einzelnen Aufrufe lassen (oder sollten) sich getrennt voneinander testen lassen; völlig gleichgültig, welches test-framework man verwendet.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@bwbg
Aufgrund Deiner Antwort hab' ich mich dazu überwunden, mich nochmals etwas näher mit diesen sch... Dekoratoren zu beschäftigen und ich glaube fast, dass mein Problem beim Testen nicht die pytest fixtures, also Dekoratoren, sind.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten