我正在尝试使用模拟函数创建一个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 然后就行了。
但是有没有任何解决方案用于以上述方式导入的模拟函数?
答案 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版本的问题。 老稳定的按预期执行。