在doctest(python)中模拟Y(来自X import Y)

时间:2010-02-07 13:06:31

标签: python testing mocking doctest

我正在尝试使用模拟函数创建一个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!"

这失败了。

如果我将导入更改为导入foomodule 到处使用 foomodule.foo 然后就行了。

但是有没有任何解决方案用于以上述方式导入的模拟函数?

2 个答案:

答案 0 :(得分:4)

您刚刚遇到了许多原因之一,这些原因最好永远不会从“内部”模块中导入对象 - 只有模块本身(可能来自包内)。我们已将此规则作为Google格式指南的一部分(已发布here),我衷心向每位Python程序员推荐它。

话虽这么说,你需要做的是把你刚用模拟替换的foomodule.foo放在当前模块中。我不记得doctest的内部确认是否

   >>> import foomodule
   >>> foo = foomodule.foo

就足够了 - 尝试一下,如果不起作用,请改为

   >>> import foomodule
   >>> import sys
   >>> sys.modules[__name__].foo = foomodule.foo
是的,这是一团糟,但这个混乱的原因是无辜的from foomodule import foo - 避开了,你的生活会更简单,更富有成效; - )。

答案 1 :(得分:2)

最后,发现这是MiniMock的trunk版本的问题。 老稳定的按预期执行。