Python: 使用给定的参数列表调用方法

Python: Call a method with a given list of arguments

我正在使用 PyUnit 对我的软件进行单元测试,不幸的是模拟对象提供的断言(例如 mock.assert_called_with)似乎没有提供断言失败时设置消息的方法。这就是为什么我想使用这样的包装器:

def wrap_mock_msg(mock_method, *args, msg):
try:
    mock_method(<args here!>)
except AssertionError as e:
    raise AssertionError(e.args, msg)

它将给定模拟对象的断言方法作为mock_method,失败时显示的消息为msg,以及一系列要作为 args 传递给 mock_method 的参数。 我需要它是一个变量 args 列表,因为 mock.assert_called_with(arg1, arg2, .., arg_n)也可以接受任意数量的参数,这取决于我试图模拟的方法。

不幸的是,我不能只将参数列表传递给 mock_method,因为它当然会被视为单个参数。现在,这让我面临必须将参数列表传递给 mock_method 的挑战,就好像我硬输入了它一样。例如:

args = ['an', 'example']

..应该导致以下调用:

mock_method('an', 'example')

有什么办法可以实现吗?

您可以拨打:

mock_method(*args)

使用 * 运算符可以两种方式解包。包装器中的参数被解压缩到一个列表中,然后该列表被解压缩到函数中。

您可以使用 * 运算符解压列表中的项目。您需要以这种方式将参数作为元组传递。代码如下所示:

def wrap_mock_msg(mock_method, args, msg):
    try:
        mock_method(*args)
    except AssertionError as e:
        raise AssertionError(e.args, msg)