2010-10-06 83 views
9

我想在Python中使用unittest做一个简单的测试,看看如果一个类如果得到一个不适合的构造函数输入的话就会抛出一个异常。这个类看起来是这样的:在Python中测试 - 如何在使用unittest测试中使用assertRaises?

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 2 arguments (1 given)

我错过了什么?我应该指定什么第二个参数?

此外,我应该使用什么类型的错误来处理异常,即我的正则表达式无法匹配的输入传递给构造函数?

谢谢,托马斯

+0

我不能直接运行的代码,因为是for循环附近的语法错误。你能纠正一下吗? – pyfunc 2010-10-06 21:53:26

+0

我认为循环的缩进不正确 – pyfunc 2010-10-06 21:56:13

+0

@pyfunc:对此抱歉。更正它。 – 2010-10-06 21:58:19

回答

12

那是因为你的类需要一个参数,而实例化对象

,而你是通过

ukol1.SummaryFormula() 

你应该已经传递参数summaryFormula它。

ukol1.SummaryFormula(someSummaryFormula) 

而且混乱是因为你的类名是SummaryFormula和你传递给__init__参数也SummaryFormula

或这应该是

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

这当然是我第一次尝试,但如果我使用self.assertRaises(TypeError,ukol1.SummaryFormula(“testtest”),“testtest”),我得到其他错误:SummaryFormula实例气没有__call__方法。是不是你指定传递给在assertRaises中测试的函数的参数作为assertRaises()函数的第三个(或第四,第五,...)参数? – 2010-10-06 21:51:57

+1

@Tomas Novotny:我在尝试运行代码时添加了第二个更改。在这里重复:self.assertRaises(TypeError,ukol1.SummaryFormula,“testtest”) – pyfunc 2010-10-06 21:54:39

18

assertRaises是有点混乱,因为你需要给它可调用的,而不是表达这个调用的表达式。

你的代码更改为:

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

在你的代码,你自己调用构造函数,它会引发你没有足够的论据例外。相反,您需要给assertRaises可调用(ukol1.SummaryFormula)以及用(“testtest”)调用它的参数。然后它可以调用它,捕获并检查异常。

2

一个更通用的替代格式是

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) 
0

由于没有其他的答案指向你如何使用它封装引起异常的代码,这里是你如何能做到这一点的情况下。

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,分别是:

  • 例外
  • 预计
  • expected_regexp
  • failureException
相关问题