Ściśle związane:In python, is there a good idiom for using context managers in setup/teardownpy.test - jak użyć menedżera kontekstowe w funcarg/urządzenia
mam menedżera kontekstowe, które jest używane w badaniach, aby ustalić czas/strefę czasową. Chcę go mieć w pytce funcarg (lub urządzeniu, używamy pytest
2.2.3 ale mogę tłumaczyć wstecz). Mogę to zrobić:
def pytest_funcarg__fixedTimezone(request):
# fix timezone to match Qld, no DST to worry about and matches all
# Eastern states in winter.
fixedTime = offsetTime.DisplacedRealTime(tz=' Australia/Brisbane')
def setup():
fixedTime.__enter__()
return fixedTime
def teardown(fixedTime):
# this seems rather odd?
fixedTime.__exit__(None, None, None)
... ale jest trochę nieprzyjemnie. W powiązanym Q jsbueno zauważa: Problem polega na tym, że twój kod nie ma przepisu na prawidłowe wywołanie metody obiektu __exit__
, jeśli wystąpi wyjątek.
His answer wykorzystuje podejście metaclass. Ale nie jest to użyteczne w pytest, gdzie często testy są po prostu funkcjami, a nie klasami. Więc jaki byłby najlepszy sposób rozwiązania tego problemu? Coś związanego z runtest hooks?
Moją obawą nie jest to, że '__exit__' nie może być wywołany, ale że nie zostanie wywołany z [prawymi wartościami] (http://docs.python.org/2/reference/datamodel .html # menedżerów kontekstów). '__exit__' jest zwykle wywoływane z wartościami odnoszącymi się do dowolnego wyjątku podniesionego w bloku' with' (w tym przypadku byłby to obiekt testowy). – pfctdayelise