4 Stimmen

Verwendung von errno mit assertRaises in Unit Test

Ich verwende assertRaises in meinem Unit-Test, um die Auslösung bestimmter Ausnahmen zu testen.

assertRaises(IOError, testToRun, passedValues)

Obwohl einige der Ausnahmen, die ich brauche, um zu erfassen, haben spezifische Fehlernummern (errno), so dass anstelle der Erfassung der Basis-Ausnahme, die ich möchte, um die spezifische Fehlernummer in Bezug auf diese Ausnahme zu erfassen. Etwas wie dieses, obwohl es offensichtlich nicht funktioniert :)

assertRaises(IOError.errno(2), testToRun, passedValue)

Um dies zu umgehen, wenn ich spezifisch nummerierte Ausnahmen erfassen möchte, habe ich Folgendes verwendet:-

try:
    testToRun(passedValues)
except IOError, e:
    if e.errno == 2:
        pass
    else:
        raise

Ich bin sicher, es ist nicht perfekt, aber es funktioniert, aber fragte sich, ob es möglich ist, assertRaises zu verwenden, um die gleiche Sache zu tun ist eine viel kompaktere Weise.

Danke.

4voto

miku Punkte 170688

Seit 2.7 ist es möglich, die assertRaises mit einem Kontextmanager:

with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)

-1voto

aquavitae Punkte 15648

Sie könnten auch eine neue TestCase-Funktion mit Ihrem aktuellen Code erstellen:

def assertRaisesErrNo(self, exc, errno, f, *args, **kwargs):
    try:
        self.assertRaises(exc, f, *args, **kwargs)
    except IOError, e:
        if e.errno == errno:
            pass
        else:
            raise

unittest.TestCase.assertRaisesErrNo = assertRaisesErrNo

Dann verwenden Sie es wie jedes andere assert Methode:

class TestSomething(unittest.TestCase):
    def test_somthing(self):
        self.assertRaisesErrNo(IOError, 2, myfunction)

Sie könnten dies auch ganz einfach in einen Kontextmanager verwandeln, indem Sie contextlib.contextmanager

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X