【发布时间】:2018-03-08 15:54:13
【问题描述】:
在 Python 3 中使用 mock 的功能,我想包装一个函数并让它执行它的所有正常功能,我只是想模拟它的返回值。换句话说,我不想模拟整个函数,只模拟它的返回值,我不知道如何实现。
def func():
# do something
# do something else
# do lots of other things
retval = 123
return retval
with mock.patch('func') as mocked:
mocked.return_value = 456
# And now, I want to run the function so that when
# it's called, "do something", "do something else",
# and "do lots of other things" still get performed,
# but that 456 gets returned instead of 123.
【问题讨论】:
-
作为测试,这根本没有任何意义。您是要测试
func,还是调用func? -
func在我的例子中所做的是初始化烧瓶中的日志记录,创建一个日志记录对象,并设置一个异常处理程序。日志记录对象在异常处理程序中使用。然后,该函数返回日志记录对象。我想通过让它执行所有标准初始化来测试它,但要返回一个可用于对记录器进行单元测试的模拟记录对象。 -
那应该是(至少)两个独立的测试。一个人打电话给真正的
func,并通过嘲笑它的合作者来确保它做正确的事情。另一个模拟func并测试正在消耗日志对象的任何内容。 -
是的,这就是我一直在做的。但我希望我可以通过简单地模拟返回值来简化这一点。我想这是不可能使用标准的
mock设施。 -
我不确定你是否真正理解了模拟的意义:它允许你单独测试这两个东西。您还应该对它们一起进行集成测试,但这样您就不会嘲笑它们中的任何一个。
标签: python python-3.x mocking wrapper