3

我正在尝试创建一个带有模拟函数的文档测试,该函数位于一个单独的模块中,并且导入如下

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那么它可以工作。

但是有没有解决上述方法导入的模拟函数的解决方案?

4

2 回答 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——避开它,你的生活会更简单、更有成效;-)。

于 2010-02-07T17:16:19.567 回答
2

最后发现这是MiniMock的trunk版的问题。老马厩的表现如预期。

于 2010-02-07T18:02:00.627 回答