doctest (python) 中的模拟 Y (from X import Y)

Evg*_*nyt 3 python testing doctest mocking

我正在尝试创建一个带有模拟功能的文档测试,该功能位于单独的模块中,并按如下方式导入

from foomodule import foo

def bar():
    """
    >>> from minimock import mock
    >>> mock('foo', nsdicts=(bar.func_globals,), returns=5)
    >>> bar()
    Called foo()
    10
    """
    return foo() * 2


import doctest
doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

foomodule.py:

def foo():
    raise ValueError, "Don't call me during testing!"
Run Code Online (Sandbox Code Playgroud)

这失败了。

如果我将 import 更改为import foomodule 并在各处使用foomodule.foo那么它就可以工作。

但是对于通过上述方式导入的模拟函数有什么解决方案吗?

Ale*_*lli 5

您刚刚遇到了最好不要从“内部”模块导入对象的众多原因之一——仅导入模块本身(可能来自包内)。我们已将此规则纳入 Google 风格指南(在此处发布),并且我衷心向每位 Python 程序员推荐它。

话虽这么说,您需要做的就是获取刚刚用模拟替换的 foomodule.foo 并将其粘贴到当前模块中。我不记得足够的 doctest 内部来确认是否

   >>> import foomodule
   >>> foo = foomodule.foo
Run Code Online (Sandbox Code Playgroud)

就足够了——尝试一下,如果不起作用,就改做

   >>> import foomodule
   >>> import sys
   >>> sys.modules[__name__].foo = foomodule.foo
Run Code Online (Sandbox Code Playgroud)

是的,这是一团糟,但造成这种混乱的原因是看起来天真无邪的from foomodule import foo——避免这种情况,你的生活会更简单、更有成效;-)。