python - 如何在 Python 中模拟使用 ctypes.byref 作为参数之一的 ctypes 函数

标签 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 中返回的值。

这可能吗?如果可能的话,如何实现?

最佳答案

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

x is ctypes.byref(x)._obj

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

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

byref_session_handle._obj.value = whatever

关于python - 如何在 Python 中模拟使用 ctypes.byref 作为参数之一的 ctypes 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44598746/

相关文章:

java - 有没有办法强制测试方法?

java - 运行多个 Spring Boot 测试时,@MockBean 在 JMS 监听器中使用不同的实例

ruby-on-rails - 在 Rails 中测试辅助方法

Angular - 用于 Jasmine 单元测试的模拟 Promise 方法

Python-获取树中所有 child 的高度

python - 从包导入 * as _

c# - 单元测试重构

python 模拟类属性不可访问

python - pandas df.apply TypeError 数据类型不理解

python - 是否可以在 Linux 平台上使用 bbfreeze (python) 为 Windows 生成可执行文件?如果是这样,如何?