assertRaises 和 lambda 表达式,Python

assertRaises and lambda expressions, Python

我知道我可以像这样在 Python 单元测试中调用 assertRaises

self.assertRaises(ValueError, lambda: my_fxn(bad_arg))

如果我省略 lambda 表达式,my_fxnassertRaises 之前计算,并且 ValueErrorassertRaises 函数可用之前抛出处理它。

我不确定的是为什么使用lambda这里修复了未处理的异常问题。我知道 lambda 表达式通常用于将函数作为参数传递给另一个函数(或 return 来自另一个函数的函数),但似乎不需要 lambda 才能传递作为参数的函数。例如,我可以毫不费力地调用 assertEquals

assertEquals(my_fxn(arg1), my_result)

那么这里到底发生了什么?好像是用lambda不知何故"delays"评价了my_fxn。它是如何工作的?

assertRaises 调用函数,捕获异常,并通过测试。

你可以称它为 assertRaises(ValueError, my_fxn, bad_arg),它会用 bad_arg 调用 my_fxn

lambda 创建一个可调用表达式,但不调用它。因此,您可以将 lambda 赋值给一个名称:

my_name = lambda: my_fxn(bad_arg)

然后将其传递给 assertRaises(也不调用它):

assertRaises(ValueError, my_name)

assertRaises 将在内部调用它,并且仅当该函数未引发异常时才会失败。例如:

def assertRaises(error_type, function):
    try:
        function()
        assertFail()
    except error_type:
        pass