如何以Pythonic方式进行mock?

2 投票
1 回答
751 浏览
提问于 2025-04-17 06:26

Mox这个模拟库让你在模拟一个类的时候,可以选择具体的类或者不指定类。

  1. mock = mox.CreateMock(Foo) 这行代码是指定要模拟的具体类Foo,或者
  2. mock = mox.CreateMockAnything() 这行代码则是可以模拟任何东西,不指定具体类。

Mox的文档建议在可能的情况下使用第一种方法,也就是检查模拟对象的类型。因为Python是一种动态语言,所以它对类型不太严格。我觉得这两种方法看起来有点不一致。

那么,哪种模拟方法更符合Python的风格呢?

1 个回答

2

它们并不是一样的。从文档中可以看到:

有些类并没有提供公开的接口;比如,它们可能会使用 __getattribute__ 来动态创建自己的接口。对于这些类,你可以使用 MockAnything。这个工具不强制要求任何接口,所以你可以随心所欲地调用任何方法。它的工作原理是记录-重放-验证的模式。除非你真的必须使用,不然不要用这个! 你可以通过你的 Mox 实例的 CreateMockAnything 方法来创建一个 MockAnything,方法如下:

相比之下,当你使用 CreateMock(Foo) 创建一个模拟对象时,如果调用了一个未知的方法,就会抛出异常。

撰写回答