【问题标题】:What is the difference between mocking and monkey patching?模拟和猴子修补有什么区别?
【发布时间】:2017-06-01 18:11:00
【问题描述】:

我使用 python,我对测试有点陌生。我经常看到测试用本地方法替换外部依赖项,如下所示:

import some_module

def get_file_data():
  return "here is the pretend file data"

some_module.get_file_data = get_file_data

# proceed to test

我在question 中看到这被称为“猴子修补”。我还看到“模拟”一词与“猴子补丁”或似乎非常相似的场景一起使用很多。

这两个概念有区别吗?

【问题讨论】:

标签: python unit-testing testing mocking monkeypatching


【解决方案1】:

Monkey patching 在运行时用另一个函数/方法/类替换另一个函数/方法/类,用于测试目的、修复错误或以其他方式改变行为。

unittest.mock library 使用猴子补丁来用模拟对象替换部分被测软件。它提供了编写巧妙的单元测试的功能,例如:

  • 它记录了模拟对象是如何被调用的,所以你可以测试 使用断言的代码的调用行为。
  • 一个方便的装饰器patch() 用于实际的猴子修补。
  • 您可以使模拟对象返回特定值 (return_value),引发特定异常 (side_effect)。
  • “魔术方法”的嘲弄(例如 __str__)。

例如,您可以使用模拟来替换客户端中的网络 I/O(urllib、请求),这样单元测试就可以在不依赖外部服务器的情况下工作。

【讨论】:

  • 那么monkey-patchingmocking 本质上是一样的吗?
  • 有点......可能对模拟和模拟库的概念有些混淆。如前所述,monkey-patching 是将某些功能切换为另一个以方便测试的概念。 mock 是您 monkey-patch 用来替换原始功能的东西。 mock library 为您提供了一个可用于monkey-patch 的对象。 mock library 中的 mock 对象还为您提供了开箱即用的出色功能,可帮助您测试 mock 是否以某种方式运行。
  • 另请参阅 @anthony-sottilepost 以了解有关 monkeypatchmock 比较的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2023-03-31
  • 2012-03-13
  • 2013-12-26
  • 2012-06-14
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多