2016-07-18 8 views
1

無効な文字がある場合はxml文字列を解析する関数があります。etree.parseは解析エラーを発生させ、関数は文字列をデコードして文字列をエンコードすることによって処理します。例外を処理する部分をどのようにテストしますか?有効なデータの場合と同様に、無効なデータの通常の出力を返します。例外を処理する関数のUnitest

def get_parse_tree(xml): 
    try: 
     tree = etree.parse(cStringIO.StringIO(xml)) 
    except etree.ParseError: 
     clean_xml = xml.decode("utf-8", errors="ignore").encode("utf-8") 
     tree = etree.parse(cStringIO.StringIO(clean_xml)) 
    except Exception as e: 
     print e 
    return tree 
+1

例外を発生させるためにetree.parseをモックアウトしますか?最後のケース( 'Exception'では*' ParseError'ではない*)では、あなたの関数は動作しません。 – jonrsharpe

+0

例外を印刷するだけで処理する "ふりをする"ことはできません。それを(標準出力ではなく標準エラーに)記録するが、すぐに裸の 'raise'文でそれを再発生させる。 – chepner

+0

@chepnerもし私がそれを上げようとしていたら、その例外ハンドラを削除するだけでいいですか? –

答えて

1

あなたのユニットテストを使用することができます。単に不正な入力で関数を呼び出し、予想される "固定"値が返されるか、または回復不能なエラーが発生しているかどうかを確認してください。

self.assertEqual(get_parse_tree("good input"), "good output one") 
self.assertEqual(get_parse_tree("bad but recoverable input"), "good output two") 
self.assertRaise(Exception, get_parse_tree, "bad, unrecoverable input") 
1

あなたはunittestTestCaseを使用している場合は、必ずしもすべての場合には、例外が悪いの入力により上昇する、気にする必要はありませんassertRaises

class TestSuite(TestCase): 

    def test_get_parse_tree(self): 
     with self.assertRaises(etree.ParseError): 
      # Force your error here