模拟和猴子修补有什么区别?

Jad*_*d S 9 python testing unit-testing monkeypatching mocking

我使用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
Run Code Online (Sandbox Code Playgroud)

我在这个问题中看到这被称为"猴子修补" .我还看到"模拟"这个词与"钱修补"或者似乎非常相似的场景一起使用了很多.

这两个概念有什么区别吗?

Ren*_*ijl 9

Monkey修补在运行时将另一个函数/方法/类替换为测试purpses,修复bug或以其他方式改变行为.

unittest.mock图书馆利用猴子补丁的由模拟对象测试来代替你的软件的一部分.它提供了编写聪明的单元测试的功能,例如:

  • 它记录了如何调用模拟对象,因此您可以使用断言测试代码的调用行为.
  • patch()实际猴子修补的方便装饰.
  • 您可以使模拟对象返回特定值(return_value),引发特定异常(side_effect).
  • 嘲弄'魔法'(例如__str__).

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

  • 那么,`monkey-patching` 和 `mock` 本质上是一样的吗? (12认同)
  • 有点……对模拟和模拟库的概念可能有些混淆。如前所述,“猴子修补”是将某些功能切换为另一个功能以方便测试的概念。“mock”是你用“monkey-patch”来替换原始功能的东西。“模拟库”为您提供了一个可用于“猴子补丁”的对象。“模拟库”中的“模拟”对象还为您提供了开箱即用的出色功能,可以帮助您测试模拟是否以某种方式运行。 (5认同)
  • 另请参阅 [@anthony-sottile](/sf/users/56852841/) 的 [帖子](https://github.com/pytest-dev/pytest/issues/4576#issuecomment -449864333)以了解有关“monkeypatch”与“mock”比较的更多信息。 (3认同)