doctest (python) 中的模拟 Y (from X import Y)

发布于 2024-08-20 12:38:28 字数 612 浏览 7 评论 0原文

我正在尝试创建一个带有模拟功能的文档测试,该功能位于单独的模块中 并按以下方式导入

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 然后就可以了。

但是对于通过上述方式导入的模拟函数有什么解决方案吗?

I'm trying to create a doctest with mock of function that resides in a separate module
and that is imported as bellow

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!"

This fails.

If I change import to import foomodule
and use foomodule.foo everywhere
Then it works.

But is there any solution for mocking function imported the way above?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

秋叶绚丽 2024-08-27 12:38:28

您刚刚遇到了最好不要从“内部”模块导入对象的众多原因之一——仅导入模块本身(可能来自包内)。我们已将此规则纳入 Google 风格指南(发布于此处) 我衷心向每一位 Python 程序员推荐它。

话虽这么说,您需要做的就是获取刚刚用模拟替换的 foomodule.foo 并将其粘贴到当前模块中。我不记得足够多的 doctest 内部来确认是否

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

足够了——尝试一下,如果不起作用,那就做是

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

的,这是一团糟,但造成这种混乱的原因是看起来无辜的from foomodule import foo -- 避免这种情况,你的生活会更简单、更有效率;-)。

You've just met one of the many reasons that make it best to never import object from "within" modules -- only modules themselves (possibly from within packages). We've made this rule part of our style guidelines at Google (published here) and I heartily recommend it to every Python programmer.

That being said, what you need to do is to take the foomodule.foo that you've just replaced with a mock and stick it in the current module. I don't recall enough of doctest's internal to confirm whether

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

will suffice for that -- give it a try, and if it doesn't work, do instead

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

yeah, it's a mess, but the cause of that mess is that innocent-looking from foomodule import foo -- eschew that, and your life will be simpler and more productive;-).

梦忆晨望 2024-08-27 12:38:28

最后发现这是MiniMock trunk版本的问题。
老稳定的表现符合预期。

Finally, found out that this was rather an issue of trunk version of MiniMock.
Old stable one performs as expected.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文