4
class AppError(Exception): pass

class MissingInputError(AppError):

    em = {1101: "Date input is missing. Please verify.", \
          1102: "Key input is missing. Please verify.", \
          1103: "Stn input is missing. Please verify."}
          # and so on ...

..。

def validate(self):
    """ Method of Input class to validate input and save it """

    params = self.__params

    if 'dt' in params:
        self.__validateKey(escape(params['dt'][0]))
    else:
        raise MissingInputError(1101)

    if 'key' in params:
        self.__validateService(escape(params['key'][0]))
    else:
        raise MissingInputError(1102)

    # and so on ...

上記のユニットテストでは、MissingInputテストクラスで次のテストが行​​われていることがわかります。

def testMissingKeyInput(self):
    """ Missing key should raise error """
    ip = controller.Input(MissingInput.missInputKey)
    self.assertRaises(errors.MissingInputError, ip.validate)

def testMissingDtInput(self):
    """ Missing dt should raise error """
    ip = controller.Input(MissingInput.missInputDt)
    self.assertRaises(errors.MissingInputError, ip.validate)

# and so on ...

MissingInputError例外が発生したかどうかを正しく検出します。

テストで、例外の呼び出し中にどのエラー番号が例外に渡されたかを判断する方法はありますか?そうすれば、他の欠落している入力ではなく、その特定の欠落している入力に対してエラーが発生していることを確認できますか?

(PS:Python 2.4.3)。


ヒント:2.4から2.6に固執している場合は、 unittest2ライブラリを使用してください。Python 2.7および3.2では、ユニットテストに対する多くの改善が行われる予定です。unittest2は、Python 2.4、2.5、および2.6で動作する新機能(およびテスト)のバックポートです。

4

2 に答える 2

3

メッセージに対して実行される正規表現を渡すことができます。

import unittest

class MyError(Exception):
    pass

def raiseError():
    raise MyError(100)

class TestStuff(unittest.TestCase):
    def testError(self):
        self.assertRaisesRegexp(MyError, '100', raiseError)

unittest.main()    

それはあなたにとって意味がありますか?MyError('foo')またはMyError(101)を発生させた場合、これらは' 100'の正規表現と一致しないため、テストは失敗します。幸い、このメソッドは、数値や文字列にキャストできるその他のものに対して機能します。

assertRaisesRegexpの詳細については、unittestのドキュメントを参照してください。

または、Python 2.6以前を使用している場合、assertRaisesRegexpは存在しないため、次のような操作を行う必要があります。

try:
    <code>
except MyError, message:
    self.failUnlessEqual(message.args, <expected args>)
else:
    self.fail('MyError not raised')
于 2011-06-01T19:09:39.303 に答える
2

パラメータは次のargs属性にあります。

>>> class CustomException(Exception):
...     pass
... 
>>> e = CustomException(42)
>>> e.args
(42,)

Python2.4でも利用できると思います。

HTH

編集:単体テストは一般的なコードであるため、そのargs中で引数を使用することもできます。

>>> import unittest
>>> class Test(unittest.TestCase):
...     def testA(self):
...         try:
...             raise CustomException(42)
...         except CustomException, e:
...             self.assertEquals(e.args[0], 42)
... 
>>> 
于 2011-06-01T19:20:00.423 に答える