31

私はクラスを持っています:

class MyClass:
def __init__(self, foo):
    if foo != 1:
        raise Error("foo is not equal to 1!")

そして、コンストラクターに渡された正しくない引数が適切にエラーを発生させることを確認するはずの単体テスト:

def testInsufficientArgs(self):
    foo = 0
    self.assertRaises((Error), myClass = MyClass(Error, foo))

しかし、私は...

NameError: global name 'Error' is not defined

なんで?この Error オブジェクトをどこで定義する必要がありますか? デフォルトの例外タイプとして組み込まれていると思いましたよね?

4

3 に答える 3

29

この例の「エラー」は、任意の例外オブジェクトである可能性があります。「適切な例外クラス」を意味するメタシンタティックプレースホルダーとして使用したコード例を読んだことがあると思います。

すべての例外の基本クラスは「例外」と呼ばれ、そのサブクラスのほとんどは、「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関数をコピーし、少し変更しました。

于 2008-09-17T22:29:33.013 に答える
6

これはどう:

class MyClass:
    def __init__(self, foo):
        if foo != 1:
            raise Exception("foo is not equal to 1!")

import unittest

class Tests(unittest.TestCase):
    def testSufficientArgs(self):
        foo = 1
        MyClass(foo)

    def testInsufficientArgs(self):
        foo = 2
        self.assertRaises(Exception, MyClass, foo)

if __name__ == '__main__':
    unittest.main()
于 2008-09-17T22:32:16.657 に答える
1

私はあなたが例外について考えていると思います。説明の「エラー」という単語を「例外」に置き換えれば、うまくいくはずです:-)

于 2008-09-17T22:30:21.110 に答える