我正在使用 Sphinx 记录一个依赖于 wxPython 的项目,使用autodocs扩展,以便它会自动从我们的文档字符串生成页面。autodocs扩展会自动在你的每个模块上运行import
,这对我们的包来说很好,但当我们import
使用像 wxPython 这样的大型外部库时就会出现问题。因此,我没有让它从 wxPython 生成所有内容,而是使用unittest.mock
库模块(以前是外部包Mock)。最基本的设置适用于 wxPython 的大多数部分,但我遇到了一种我看不到简单方法的情况(可能是因为直到本周我对mock相对不熟悉)。
目前,我的conf.py
文件末尾有以下内容:
MOCK_MODULES = ['wx.lib.newevent'] # I've skipped irrelevant entries...
for module_name in MOCK_MODULES:
sys.modules[module_name] = mock.Mock()
对于所有 wxPython 模块但是wx.lib.newevent
,这非常有效。但是,这里我使用newevent.NewCommandEvent()
函数 [1] 为特定场景创建事件。NewCommandEvent()
在这种情况下,我会在通话中收到带有 note的警告TypeError: 'Mock' object is not iterable
。
虽然我可以看到如何使用修补程序来处理这个以构建单元测试(我将在下个月这样做!),但我很难看到如何在我的 Sphinx 配置中以简单的级别集成它.
编辑:我也尝试过使用MagicMock()
;这仍然会在同一点产生错误,尽管它现在产生ValueError: need more than 0 values to unpack
. 这似乎是朝着正确方向迈出的一步,但我仍然不确定如何处理这个问题,而不是为这个模块明确设置它。不过,也许这是最好的解决方案?
脚注
- 是的,这是一个函数,尽管命名约定使它看起来像一个类;wxPython 遵循整个 wxWidgets 工具包中使用的 C++ 命名约定。