如何在Python中模拟ctypes函数,该函数使用ctypes.byref作为其中一个参数

时间:2017-06-16 22:21:45

标签: python unit-testing mocking

我正在研究DLL / SO的Python包装器。我已验证代码工作调用实际的DLL和SO。我想对我的包装器进行单元测试,而不需要安装底层的DLL / SO。我正在考虑使用mock

我遇到问题的问题是使用byref参数并以这种方式返回值的函数。例如,如果C基金看起来像这样:

int initialize(char *resource, ulong *new_handle)
{
    // Some code here
    *new_handle = temp_handle;
    return error;
}

,Python代码如下:

error_code = library.initialize(resource.encode('ascii'), ctypes.byref(session_handle))

我能够模拟函数并设置返回值(error_code),但我无法弄清楚如何设置session_handle中返回的值。

这可能吗?如果可以,怎么做?

1 个答案:

答案 0 :(得分:1)

您可以通过返回值的byref属性访问传递给_obj的对象:

x is ctypes.byref(x)._obj

或者至少,你现在可以。这是一个未记录的API,可能会有变化。

获得对象后,可以通过其value属性将其值设置为常用的ctypes方式:

byref_session_handle._obj.value = whatever