在Python的doctest中如何模拟(from X import Y)中的Y?

3

我正在尝试使用模拟(mock)创建一个文档测试(doctest),该函数位于一个单独的模块中,并以以下方式导入。

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()

foomodule.py:

def foo():
    raise ValueError, "Don't call me during testing!"

这个失败了。

如果我将import更改为import foomodule并在所有地方使用foomodule.foo,那么它就可以工作了。

但是是否有一种方法可以模拟以上述方式导入的函数?


我在Mock模块中看到了非常相似的情况。这个问题解决了吗? - shreddd
2个回答

4
你刚刚遇到了从“内部”模块导入对象的许多原因之一,这是最好永远不要这样做 - 只导入模块本身(可能是从包内)。我们已将此规则纳入Google的样式指南中(在此处发布),我向每个Python程序员衷心推荐它。
话虽如此,你需要做的是将刚刚替换为模拟数据的foomodule.foo放入当前模块中。我不记得足够多的doctest内部信息来确认是否
   >>> import foomodule
   >>> foo = foomodule.foo

如果那样可以满足需求的话--试一试,如果不行,就换另一种方式

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

是的,这很混乱,但这种混乱的原因在于看似无害的from foomodule import foo - 避免使用它,你的生活将更简单、更高效;-)。


Alex,感谢你提供的指南链接。我一定会在标准PEP的基础上使用它。 - Evgenyt
1
发布的链接是一个404。 - kyrofa
当前链接似乎是Google的Python风格指南,可以在他们的GitHub仓库中找到。 - alttag

2
最终发现这其实是MiniMock的主干版本问题,旧稳定版本则表现正常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接