この例の「エラー」は、任意の例外オブジェクトである可能性があります。「適切な例外クラス」を意味するメタシンタティックプレースホルダーとして使用したコード例を読んだことがあると思います。
すべての例外の基本クラスは「例外」と呼ばれ、そのサブクラスのほとんどは、「OSError」、「ValueError」、「NameError」、「TypeError」など、関連するエラーのタイプの説明的な名前です。
この場合、適切なエラーは「ValueError」です(fooの値が間違っていたため、ValueError)。スクリプトで「Error」を「ValueError」に置き換えることをお勧めします。
これがあなたが書き込もうとしているコードの完全なバージョンです。元の例には割り当てと混同しているように見える奇妙なキーワード引数があり、「failUnless」関数を使用しているため、すべてを複製しています。これは、関数のエイリアス化されていない名前であるためです。
class MyClass:
def __init__(self, foo):
if foo != 1:
raise ValueError("foo is not equal to 1!")
import unittest
class TestFoo(unittest.TestCase):
def testInsufficientArgs(self):
foo = 0
self.failUnlessRaises(ValueError, MyClass, foo)
if __name__ == '__main__':
unittest.main()
出力は次のとおりです。
.
----------------------------------------------------------------------
Ran 1 test in 0.007s
OK
ユニットテストライブラリ「unittest」には、他のユニットテストフレームワークが修正する欠陥があります。呼び出し元のコンテキストから例外オブジェクトにアクセスすることは不可能であることに注意してください。これを修正したい場合は、UnitTestのサブクラスでそのメソッドを再定義する必要があります。
これは使用例です。
class TestFoo(unittest.TestCase):
def failUnlessRaises(self, excClass, callableObj, *args, **kwargs):
try:
callableObj(*args, **kwargs)
except excClass, excObj:
return excObj # Actually return the exception object
else:
if hasattr(excClass,'__name__'): excName = excClass.__name__
else: excName = str(excClass)
raise self.failureException, "%s not raised" % excName
def testInsufficientArgs(self):
foo = 0
excObj = self.failUnlessRaises(ValueError, MyClass, foo)
self.failUnlessEqual(excObj[0], 'foo is not equal to 1!')
python2.5のunittest.pyからfailUnlessRaises関数をコピーし、少し変更しました。