Python中的测试-如何在使用'unittest'的测试中使用assertRaises?[duplicate]

nkhmeac6  于 2023-01-08  发布在  Python
关注(0)|答案(5)|浏览(119)
    • 此问题在此处已有答案**:

(19个答案)
四年前关闭了。
我尝试在Python中使用'unittest'做一个简单的测试,看看如果一个类得到了一个不适合构造函数的输入,它是否会抛出异常。

class SummaryFormula:
    def __init__( self, summaryFormula):
        self.atoms = {}
        for atom in re.finditer( "([A-Z][a-z]{0,2})(\d*)", summaryFormula):
            symbol = atom.group(1)
            count = atom.group(2)

            if pocet != "":
                self.atoms[ symbol] = int(count)
            else:
                self.atoms[ symbol] = 1

我的测试如下:

class ConstructorTestCase(unittest.TestCase):
      def testEmptyString(self):
        self.assertRaises(TypeError, ukol1.SummaryFormula(), "testtest")

    if __name__ == '__main__':
      unittest.main()

我所希望的只是测试失败,这意味着不处理构造函数输入不合适的异常。
相反,我得到了一个错误:__init__() takes exactly two arguments (1 given).
我漏掉了什么?我应该说明的第二个参数是什么?
另外,我应该使用什么类型的Error来处理异常,即一个与我的regexp不匹配的输入被传递给了构造函数?

ioekq8ef

ioekq8ef1#

一种更像Python的方法是使用with命令(在Python 2.7中添加的):

with self.assertRaises(SomeException):
    do_something()

文件:* Assert加薪 *

4sup72z8

4sup72z82#

assertRaises有点令人困惑,因为您需要为它提供可调用项,而不是进行调用的表达式。
将代码更改为:

self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest")

在你的代码中,你自己调用构造函数,构造函数会因为参数不足而引发异常,这时你需要给assertRaises一个可调用对象(ukol1.SummaryFormula),以及调用它的参数("testtest"),然后它就可以调用它,捕捉并检查异常。

uujelgoq

uujelgoq3#

这是因为类在示例化对象时需要一个参数。
当你经过时

ukol1.SummaryFormula()

您应该已经将参数summaryFormula传递给它。

ukol1.SummaryFormula(someSummaryFormula)

另外,混淆的原因是类名是SummaryFormula,而传递给__init__的参数也是SummaryFormula
或者这应该是

self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest")
kqlmhetl

kqlmhetl4#

由于其他答案都没有指出如何使用封装导致异常的代码的上下文,因此下面介绍如何使用该上下文。

with self.assertRaises(ValueError) as ctx:
    <some code that throws an exception>

expected_msg = 'foo_bar_baz'
self.assertEquals(ctx.exception.message, expected_msg)

unittest.case._AssertRaisesContext中感兴趣的属性包括:

  • 例外
  • 预期
  • 预期正则表达式
  • 故障异常
mw3dktmi

mw3dktmi5#

更通用的替代格式是

args=['testtest']
kwargs = {}
self.assertRaises(TypeError, ukol1.SummaryFormula, *args, **kwargs)

如果你的构造函数是多态的,并且你想循环遍历一系列不同的参数编写错误,这是很有用的,例如:

arg_lists = [
    ['testtest'],
    ['anothertest'],
    ['YAT'],
]
for args in arg_lists:
    self.assertRaises(TypeError, ukol1.SummaryFormula, *args)

相关问题