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

时间:2018-08-10 19:17:55

标签: python function-call

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

cmake -DCMAKE_BUILD_TYPE=Debug path/to/sources
cmake --build . --target all
cmake --build . --target test

它将给定模拟对象的断言方法为 mock_method ,失败时显示的消息为 msg ,并将一系列参数传递给 mock_method 作为 args 。 我需要将其作为变量 args 列表,因为 mock.assert_drawn_with(arg1,arg2,..,arg_n)也可以采用任意数量的参数,具体取决于方法我想嘲笑。

不幸的是,我不能仅仅将参数列表传递给 mock_method ,因为它当然会被当作一个参数。现在,这给我带来了一个挑战,那就是必须将参数列表传递给 mock_method ,就像我已经对其进行了硬键入一样。例如:

    Start 110: UnitTest
110/119 Test #110: UnitTest.................***Exception: Child aborted  0.01 sec
dyld: Library not loaded: library.dylib
  Referenced from: /tmp/build/bin/UnitTest
  Reason: image not found

..应导致以下调用:

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

有什么办法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

您可以致电:

mock_method(*args)

使用*运算符以任何一种方式打开包装。包装器中采用的参数将解压缩到一个列表中,然后将该列表解压缩到该函数中。