【发布时间】:2011-07-14 06:29:57
【问题描述】:
我正在尝试使用 python mock module Mock 一个函数(返回一些外部内容)。
我在模拟导入到模块中的函数时遇到了一些问题。
例如在util.py我有
def get_content():
return "stuff"
我想模拟 util.get_content 以便它返回其他内容。
我正在尝试这个:
util.get_content=Mock(return_value="mocked stuff")
如果get_content 在另一个模块中被调用,它实际上似乎永远不会返回模拟对象。我在如何使用Mock 方面遗漏了什么吗?
请注意,如果我调用以下内容,则一切正常:
>>> util.get_content=Mock(return_value="mocked stuff")
>>> util.get_content()
"mocked stuff"
但是,如果从另一个模块内部调用 get_content,它会调用原始函数而不是模拟版本:
>>> from mymodule import MyObj
>>> util.get_content=Mock(return_value="mocked stuff")
>>> m=MyObj()
>>> m.func()
"stuff"
mymodule.py的内容
from util import get_content
class MyObj:
def func():
get_content()
所以我想我的问题是 - 如何从我调用的模块内部调用函数的模拟版本?
看来from module import function 可能是这里的罪魁祸首,因为它没有指向 Mocked 函数。
【问题讨论】:
-
我遵循了您的确切描述(在 python 2.5 中,在 linux 上使用 mock 0.7.0),它运行良好。你有更多的细节可以提供吗?
-
Hmm - 从顶级范围调用该函数时,它看起来像预期的那样运行。但是,当它从另一个模块或函数内部(即调用堆栈的更下方)被调用时,它不会表现出 Mock-ed 行为。我正在澄清这个例子来说明这一点。
-
好的,我尝试了您的新描述 - 我仍然得到正确答案,即使来自
mymodule.func()。对我来说唯一的区别是我的mymodule.func()returnsutil.get_content(),而不只是调用它。我觉得你的描述中一定还缺少一些信息。您是否真的尝试过上面的确切描述?你的实际代码是什么? -
对此感到抱歉 - 我避免粘贴大段代码。你是对的 - 我的简化示例并没有完全失败,但我认为我已经部分找到了解决方案。会更新这个。
-
奇怪 - 在我更复杂的 Django 测试用例中,事情并没有正常工作,但是当我尝试将它提炼下来时,Mock 对象似乎正在按预期传递。我猜在创建命名空间略有不同的导入中存在一些差异。
标签: python unit-testing mocking