Wie kann man einen Unittest schreiben, der nur dann fehlschlägt, wenn eine Funktion keine erwartete Ausnahme auslöst?
Antworten
Zu viele Anzeigen?Dies wird TypeError auslösen, wenn stock_id in dieser Klasse auf einen Integer gesetzt wird. Der Test ist erfolgreich, wenn dies der Fall ist und schlägt ansonsten fehl.
def set_string(prop, value):
if not isinstance(value, str):
raise TypeError("i told you i take strings only ")
return value
class BuyVolume(ndb.Model):
stock_id = ndb.StringProperty(validator=set_string)
from pytest import raises
buy_volume_instance: BuyVolume = BuyVolume()
with raises(TypeError):
buy_volume_instance.stock_id = 25
Unit-Tests mit Unittest wären vorzuziehen, aber wenn Sie eine schnelle Lösung wünschen, können wir die Ausnahme abfangen, sie einer Variablen zuweisen und prüfen, ob diese Variable eine Instanz der Ausnahmeklasse ist.
Gehen wir davon aus, dass unsere schlechte Funktion einen ValueError auslöst.
try:
bad_function()
except ValueError as e:
assert isinstance(e, ValueError)
Während alle Antworten völlig in Ordnung sind, suchte ich nach einer Möglichkeit zu testen, ob eine Funktion eine Ausnahme ausgelöst hat, ohne sich auf Unit-Testing-Frameworks zu verlassen und Testklassen schreiben zu müssen.
Am Ende habe ich Folgendes geschrieben:
def assert_error(e, x):
try:
e(x)
except:
return
raise AssertionError()
def failing_function(x):
raise ValueError()
def dummy_function(x):
return x
if __name__=="__main__":
assert_error(failing_function, 0)
assert_error(dummy_function, 0)
Und es scheitert an der richtigen Linie:
Traceback (most recent call last):
File "assert_error.py", line 16, in <module>
assert_error(dummy_function, 0)
File "assert_error.py", line 6, in assert_error
raise AssertionError()
AssertionError
- See previous answers
- Weitere Antworten anzeigen