Chr*_*cho 9 python mocking python-sphinx python-mock
我正在使用Sphinx来记录依赖于wxPython的项目,使用autodocs扩展,以便它自动生成来自docstrings的页面.该autodocs扩展自动每个模块你在工作import,这是很好的为我们的软件包,但就是一个问题,当我们import一个大的外部库像wxPython的.因此,不是让它从wxPython生成所有内容,而是使用unittest.mock 库模块(以前是外部包Mock).最基本的设置适用于wxPython的大多数部分,但是我遇到了一种我看不到简单方法的情况(可能是因为我本周对模拟的相对不熟悉).
目前,我的conf.py文件结尾有以下内容:
MOCK_MODULES = ['wx.lib.newevent'] # I've skipped irrelevant entries...
for module_name in MOCK_MODULES:
sys.modules[module_name] = mock.Mock()
Run Code Online (Sandbox Code Playgroud)
对于所有wxPython模块,但是wx.lib.newevent,这非常有效.但是,这里我使用newevent.NewCommandEvent()函数[1]为特定场景创建事件.在这种情况下,我会在NewCommandEvent()通话时收到警告TypeError: 'Mock' object is not iterable.
虽然我可以看到如何使用补丁来处理这个以构建单元测试(我将在下个月进行!),我很难看到如何在我的Sphinx配置中将它集成到一个简单的级别.
编辑:我刚尝试使用MagicMock(); 这仍然会在同一点产生错误,尽管它现在产生了ValueError: need more than 0 values to unpack.这似乎是朝着正确方向迈出的一步,但我仍然不确定如何处理这个模块的明确设置.也许这是最好的解决方案?
从错误来看,它看起来实际上正在执行newevent.NewCommandEvent(),所以我假设您的代码中的某个地方有一个顶级行,如下所示:
import wx.lib.newevent
...
event, binder = wx.lib.newevent.NewCommandEvent()
Run Code Online (Sandbox Code Playgroud)
当 autodoc 导入模块时,它会尝试运行这行代码,但由于它NewCommandEvent实际上是一个Mock对象,因此 Python 无法将其输出绑定到(event, binder)元组。有两种可能的解决方案。第一个是将代码更改为在导入时不执行,也许可以将其包装在if __name__ == '__main__'. 我会推荐这个解决方案,因为在导入时创建这样的对象通常会产生预问题的副作用。
第二种解决方案是告诉Mock对象返回适当的值:
wx.lib.newevent.NewCommandEvent = mock.Mock(return_value=(Mock(), Mock()))
Run Code Online (Sandbox Code Playgroud)
但是,如果您在代码中使用返回值执行任何操作,则可能会进一步遇到相同的问题。
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |