【问题标题】:Mock Y of (from X import Y) in doctest (python)在 doctest (python) 中模拟 Y of (from X import Y)
【发布时间】:2010-02-07 13:06:31
【问题描述】:

我正在尝试使用位于单独模块中的函数模拟创建一个 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 foomodule 并在任何地方使用 foomodule.foo 然后就可以了。

但是有没有什么办法可以模拟上述方式导入的函数呢?

【问题讨论】:

  • 我看到了与 Mock 模块非常相似的东西。这有没有解决过?

标签: python testing mocking doctest


【解决方案1】:

您刚刚遇到了最好不要从“内部”模块导入对象的众多原因之一——只导入模块本身(可能来自包内)。我们已将此规则作为 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——避开它,你的生活会变得更简单、更有成效;-)。

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2019-11-16
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2017-10-25
    相关资源
    最近更新 更多