2012-04-15 8 views
4

ユニットテストでassertRaisesを使用して、特定の例外の発生をテストしています。ユニットテストでassertRaisesでerrnoを使用する

assertRaises(IOError, testToRun, passedValues) 

私はキャプチャする必要がある例外のいくつかは、特定のエラー番号(errnoに)を持っているので、代わりにベースの例外を収集し、私はその例外に関連する特定のエラー番号をキャプチャしたいと思いますけれども。

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

私は確信している - :私は、私が使用してきたspecificly番の例外をキャプチャしたいときに、このような何かが、それは明らかに:)

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

は、この問題を回避するには動作しませんが、それは完璧ではありませんが、それは動作しますが、同じことを行うassertRaisesを使用することが可能かどうかは、よりコンパクトな方法です。

ありがとうございました。

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

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

答えて

4

方法:

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

これをコンテキストマネージャーを使用して簡単にcontextlib.contextmanager

+0

返信ありがとうございます。私はコンテキストマネージャーに慣れていないが、それを読むだろう。 – user788462

-1

あなたはまた、あなたの現在のコードを使用して新しいテストケース関数を作成することができます::

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のようにそれを使用することがコンテキストマネージャとassertRaisesを使用することが可能です2.7以来

+0

assertRaisesコールで例外が処理されないため、特別なIOErrorコードは実行されません。あなたはこれをテストしましたか? – user9876

関連する問題