Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用unittest检查代码是否进入except块_Python_Python 2.7_Python Unittest_Assertions - Fatal编程技术网

如何在Python中使用unittest检查代码是否进入except块

如何在Python中使用unittest检查代码是否进入except块,python,python-2.7,python-unittest,assertions,Python,Python 2.7,Python Unittest,Assertions,我一直在尝试编写一个测试用例,该测试用例将检查代码是否位于块之外的块中 我的方法foo() 我曾尝试使用,但后来我意识到这对我不起作用,因为我没有提出异常 Python文档中明确指出: 测试在使用任何位置或关键字参数调用callable时是否引发异常,这些参数也传递给assertRaises()。如果引发异常,则测试通过;如果引发另一个异常,则测试出错;如果未引发异常,则测试失败 所以,如果我有以下方法: def foo(): try: # Something that

我一直在尝试编写一个测试用例,该测试用例将检查代码是否位于
块之外的
块中

我的方法
foo()

我曾尝试使用,但后来我意识到这对我不起作用,因为我没有提出异常

Python文档中明确指出:

测试在使用任何位置或关键字参数调用callable时是否引发异常,这些参数也传递给assertRaises()。如果引发异常,则测试通过;如果引发另一个异常,则测试出错;如果未引发异常,则测试失败

所以,如果我有以下方法:

def foo():
    try:
        # Something that will cause an exception
    except AttributeError:
        log.msg("Shit happens")
是否可以编写一个测试用例来测试执行是否在except块内部进行?

您可以像这样使用assertRaises():

with self.assertRaises(Exception):
     foo()
_logs = []
def mocklog(str):
    _logs.append(str)

mymodule.log = mocklog
mymodule.foo()
assertEqual(_logs, ['Shit happens'])

如果您想测试日志记录,还有一种方法assertLogs。

您不能按照您想要的方式进行测试。Python到处引发和处理异常,例如,for
的每个
循环都通过引发和处理
StopIteration
退出。因此,断言某个地方存在异常,即使它已被处理,几乎总是会通过的

您可以模拟记录器,如下所示:

with self.assertRaises(Exception):
     foo()
_logs = []
def mocklog(str):
    _logs.append(str)

mymodule.log = mocklog
mymodule.foo()
assertEqual(_logs, ['Shit happens'])

当然,在现实项目中,您可能希望使用模拟库,而不是像这样手动将其破解,但这应该说明了这一想法。

您确实无法测试提出和处理的异常。如果可以的话,在Python中,从
hasattr
到简单的
for
循环都会引发和处理异常。你可以做的一件事是模拟记录器,并断言您的模拟记录器获得了记录在该处理程序中的消息。OP已经解释了他尝试了此操作,但它不起作用,并且(正确地)解释了它不起作用的原因。在您的更新中,stdlib unittest中没有方法
assertLogs
。这是您链接的文档中“Python3.4中新增”的assertLogsNotice?这意味着它不在Python2.7.Wow中,从来没有听说过它,每个for循环都通过引发和处理StopIteration@UserNotFoundException异常在Python中比大多数人意识到的更普遍。从基类调用方法时,将引发并处理在当前类中找不到该方法的异常。当您添加
2+3.0
时,
int.\uuuu add\uuuu
不知道如何添加浮点,因此它会引发,解释器会调用
float.\uuu radd\uuu
。等等其中一些在CPython中有特殊的快速路径优化,但是,更一般地说,异常尽可能简单和快速,因此它们可以在任何地方使用