【问题标题】:Run function and only mock its return code?运行函数并只模拟它的返回码?
【发布时间】: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


【解决方案1】:

我发现了这一点,这是我之前忽略的,它让我可以做我想做的事:

How to call mocked method in Python mock

感谢 jonrsharpe 帮助我阐明我真正在寻找什么。

这只是正在执行的众多单元和集成测试之一,我知道它本身的价值有限(但并非不存在)。

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多