assertRaises和lambda表达式,Python

时间:2017-05-30 18:44:14

标签: python lambda python-unittest

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

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

如果我省略lambda表达式,则my_fxn之前评估assertRaises,并且ValueError函数可用于处理之前assertRaises被抛出。

我不确定,以及我认为现有的关于此主题的答案不能很好地解释,为什么使用{{1这里修复了无法解决的异常问题。我知道lambda表达式通常用于将函数作为参数传递给另一个函数(或从另一个函数返回一个函数),但为了传递一个函数,它似乎不需要lambda作为一个论点。例如,我可以毫不费力地致电lambda

assertEquals

那到底是怎么回事?似乎assertEquals(my_fxn(arg1), my_result)以某种方式使用延迟"对lambda的评价。它是如何工作的?

1 个答案:

答案 0 :(得分:1)

assertRaises调用该函数,捕获异常并传递测试。

您可以将其称为assertRaises(ValueError, my_fxn, bad_arg),并使用my_fxn致电bad_arg

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