在单元测试中,如何确定传递给自定义异常的参数?

时间:2011-06-01 18:47:07

标签: python unit-testing custom-exceptions

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异常。

有没有办法在测试中确定在调用异常时传递给异常的错误号,以便我可以确定是针对该特定缺失输入引发错误,而不是针对任何其他缺少的输入?

(P.S: Python 2.4.3 )。


提示:如果您遇到2.4到2.6,使用unittest2 library 。 在Python 2.7和3.2中,对unittest的一系列改进将会到来。 unittest2是新功能(和测试)的后端,可与Python 2.4,2.5& 2.6。

2 个答案:

答案 0 :(得分: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 documentation

或者,如果您使用的是Python 2.6或更早版本,则不存在assertRaisesRegexp,您必须执行以下操作:

try:
    <code>
except MyError, message:
    self.failUnlessEqual(message.args, <expected args>)
else:
    self.fail('MyError not raised')

答案 1 :(得分:2)

参数位于args属性:

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

我敢打赌它也是available for Python 2.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)
... 
>>>