テストランナーを書いています。例外をキャッチして保存できるオブジェクトがあり、後でテスト失敗レポートの一部として文字列としてフォーマットされます。例外をフォーマットする手順を単体テストしようとしています。
私のテスト セットアップでは、オブジェクトがキャッチするために実際に例外をスローしたくありません。これは主に、トレースバックが予測できないことを意味するためです。(ファイルの長さが変わると、トレースバックの行番号が変わります。)
偽のトレースバックを例外に添付して、それがフォーマットされている方法についてアサーションできるようにするにはどうすればよいですか? これは可能ですか?Python 3.3 を使用しています。
簡単な例:
class ExceptionCatcher(object):
def __init__(self, function_to_try):
self.f = function_to_try
self.exception = None
def try_run(self):
try:
self.f()
except Exception as e:
self.exception = e
def format_exception_catcher(catcher):
pass
# No implementation yet - I'm doing TDD.
# This'll probably use the 'traceback' module to stringify catcher.exception
class TestFormattingExceptions(unittest.TestCase):
def test_formatting(self):
catcher = ExceptionCatcher(None)
catcher.exception = ValueError("Oh no")
# do something to catcher.exception so that it has a traceback?
output_str = format_exception_catcher(catcher)
self.assertEquals(output_str,
"""Traceback (most recent call last):
File "nonexistent_file.py", line 100, in nonexistent_function
raise ValueError("Oh no")
ValueError: Oh no
""")