与Sphinx一起使用的模拟Python可移植性

与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

我正在使用Sphinx来记录一个依赖于wxPython的项目,使用autodocs扩展,这样它将自动从我们的docString生成页面。autodocs扩展会自动在您导入的每个模块上运行,这对于我们的软件包来说很好,但是当我们导入像wxPython这样的大型外部库时,这是一个问题。因此,我使用了
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
    语句引用的所有模块。我会把这一点补充到问题中,这是有道理的。我稍后会给一个旋转,并确认它解决了我的问题假设它这样做,我会接受答案。谢谢