2008-09-17 34 views
20

我有一个类:如何使用assertRaises()测试python类的__init __()方法?

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

并应该确保传递给构造函数不正确的ARG正确引发错误单元测试:

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

,但我得到...

NameError: global name 'Error' is not defined 

为什么?我应该在哪里定义这个Error对象?我认为它是内置的默认异常类型,不是?

回答

20

本例中的'错误'可能是任何异常对象。我想也许你已经阅读了一个代码示例,用它作为一个metasyntatic占位符来表示“适当的异常类”。

所有异常的基类称为“异常”,其大部分子类都是涉及错误类型的描述性名称,如'OSError','ValueError','NameError','TypeError'。

在这种情况下,相应的错误是'ValueError'(foo的值是错误的,因此是一个ValueError)。我会建议在脚本中用'ValueError'替换'Error'。

这是您正在尝试编写的代码的完整版本,我复制了所有内容,因为您的原始示例中有一个奇怪的关键字参数,您似乎正在与某个任务合并,并且正在使用“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 

有一个在单元测试库“单元测试”,其他单元测试的一个缺陷框架修复。您会注意到,从调用上下文中获取对异常对象的访问是不可能的。如果要解决这个问题,你必须重新定义方法在单元测试的一个子类:

这是它在使用中的例子:

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!') 

我从单元测试复制failUnlessRaises功能。从python2.5 py,并稍微修改它。

+0

在这里你就错了,这就是你想要的东西,而不是,这里是你的代码打算写。这可能是我见过的最好的答案。 – LoveMeSomeCode 2013-02-03 03:03:20

+2

self.failUnlessRaises现已弃用。改用self.assertRaises。 https://docs.python.org/2/library/unittest.html#deprecated-aliases – dghubble 2014-06-12 07:55:00

1

我想你在考虑Exception s。与异常的描述更换字错误,你应该是好去:-)

5

如何:

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() 
相关问题