4

単体テストで assertRaises を使用して、特定の例外の発生をテストしています。

assertRaises(IOError, testToRun, passedValues)

キャプチャする必要がある例外の一部には特定のエラー番号 (errno) があるため、基本例外を収集する代わりに、その例外に関連する特定のエラー番号をキャプチャしたいと考えています。このようなものですが、明らかに機能しません:)

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

私が使用してきた特定の番号の例外をキャプチャしたいときにこれを回避するには:-

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

完璧ではないと確信していますが、動作しますが、 assertRaises を使用して同じことをよりコンパクトな方法で行うことができるかどうか疑問に思っていました。

ありがとう。

4

2 に答える 2

4

2.7 以降assertRaisesでは、コンテキスト マネージャーを使用できます。

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

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
于 2012-04-15T23:20:27.367 に答える
-1

現在のコードを使用して、新しい TestCase 関数を作成することもできます。

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

次に、他のassert方法と同様に使用します。

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

contextlib.contextmanagerを使用して、これをかなり簡単にコンテキストマネージャーに変えることもできます

于 2012-04-16T06:31:12.170 に答える