doctest(python)中的Mock Y of(从X导入Y)

doctest(python)中的Mock Y of(从X导入Y),python,testing,mocking,doctest,Python,Testing,Mocking,Doctest,我正在尝试创建一个doctest,其中包含驻留在单独模块中的mock函数 这是作为贝娄进口的 from foomodule import foo def bar(): """ >>> from minimock import mock >>> mock('foo', nsdicts=(bar.func_globals,), returns=5) >>> bar() Called foo() 1

我正在尝试创建一个doctest,其中包含驻留在单独模块中的mock函数 这是作为贝娄进口的

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()
foodule.py:

def foo():
    raise ValueError, "Don't call me during testing!"
这是失败的

如果我将导入更改为导入模块 并在任何地方使用foomodule.foo 然后它就起作用了


但是,有没有办法通过上述方式导入模拟函数呢?

您刚刚遇到了许多原因之一,这些原因使得最好不要从“内部”模块导入对象,而只导入模块本身(可能来自包内)。我们已经将这条规则作为我们在Google(已发布)的风格指南的一部分,我衷心地向每一位Python程序员推荐它

也就是说,您需要做的是获取刚才用mock替换的foomodule.foo并将其粘贴到当前模块中。我记不起足够的doctest的内部信息来证实

   >>> import foomodule
   >>> foo = foomodule.foo
这就足够了--试试看,如果不行,就试试看

   >>> import foomodule
   >>> import sys
   >>> sys.modules[__name__].foo = foomodule.foo

是的,这是一片混乱,但造成这种混乱的原因是foo模块导入foo的天真的
——避开它,你的生活会更简单、更有效率;-)

最后,我发现这是MiniMock主干版本的问题。
旧的stable one的性能与预期一致。

Alex,感谢您提供的指南链接。除了标准的PEP,我肯定还会使用。发布的链接是404。看起来当前的链接和他们的一样。我看到了与模拟模块非常相似的东西。这个问题解决了吗?