与Sphinx一起使用的模拟Python可移植性
我正在使用Sphinx来记录一个依赖于wxPython的项目,使用autodocs扩展,这样它将自动从我们的docString生成页面。autodocs扩展会自动在您导入的每个模块上运行,这对于我们的软件包来说很好,但是当我们导入像wxPython这样的大型外部库时,这是一个问题。因此,我使用了与Sphinx一起使用的模拟Python可移植性,python,mocking,python-sphinx,python-mock,Python,Mocking,Python Sphinx,Python Mock,我正在使用Sphinx来记录一个依赖于wxPython的项目,使用autodocs扩展,这样它将自动从我们的docString生成页面。autodocs扩展会自动在您导入的每个模块上运行,这对于我们的软件包来说很好,但是当我们导入像wxPython这样的大型外部库时,这是一个问题。因此,我使用了unittest.mock(以前是外部包),而不是让它从wxPython生成所有内容。最基本的设置在wxPython的大多数部分都可以正常工作,但我遇到了一种无法轻松解决的情况(可能是因为我在本周之前对m
unittest.mock
(以前是外部包),而不是让它从wxPython生成所有内容。最基本的设置在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模块,但是,这非常有效。但是,这里我使用函数[1]为特定场景创建一个事件。在本例中,我在NewCommandEvent()
调用中得到一个警告,提示TypeError:“Mock”对象不可编辑
虽然我可以看到在构建单元测试时如何处理这个问题(我将在下个月做!),但我很难看到如何在我的Sphinx配置中简单地集成它
编辑:我也尝试过使用MagicMock()
;这仍然会在同一点上产生错误,尽管它现在会产生ValueError:需要超过0个值才能解包
。这似乎是朝着正确的方向迈出的一步,但我仍然不确定如何处理这一问题,无法明确地为这一模块设置它。也许这是最好的解决办法
脚注
是的,这是一个函数,命名约定使它看起来像一个类;WxPython遵循在WxWistGooTooKiTo.[L/LI]中使用的C++命名约定。
从错误中可以看出,它实际上是在执行newevent.NewCommandEvent()
,因此我假设在代码中的某个地方有一个类似以下内容的顶级行:
import wx.lib.newevent
...
event, binder = wx.lib.newevent.NewCommandEvent()
当autodoc导入模块时,它会尝试运行这行代码,但由于NewCommandEvent
实际上是一个Mock
对象,Python无法将其输出绑定到(事件,绑定器)
元组。有两种可能的解决办法。第一种方法是将代码更改为在导入时不执行此操作,可以将其包装在中,如果
。我建议使用这种解决方案,因为在导入时创建这样的对象通常会有问题的副作用
第二种解决方案是告诉Mock
对象返回适当的值,因此:
wx.lib.newevent.NewCommandEvent = mock.Mock(return_value=(Mock(), Mock()))
但是,如果您在代码中使用返回的值执行任何操作,您可能会遇到相同的问题。在我所有与Sphinx的接触中,它从未自动记录我没有明确告诉它的内容,因此请您详细说明Sphinx的哪一部分导致了这种行为?很好。导致问题的是autodoc
模块:它自动包括import
语句引用的所有模块。我会把这一点补充到问题中,这是有道理的。我稍后会给一个旋转,并确认它解决了我的问题假设它这样做,我会接受答案。谢谢