如何以Pythonic方式进行mock?
Mox这个模拟库让你在模拟一个类的时候,可以选择具体的类或者不指定类。
mock = mox.CreateMock(Foo)
这行代码是指定要模拟的具体类Foo,或者mock = mox.CreateMockAnything()
这行代码则是可以模拟任何东西,不指定具体类。
Mox的文档建议在可能的情况下使用第一种方法,也就是检查模拟对象的类型。因为Python是一种动态语言,所以它对类型不太严格。我觉得这两种方法看起来有点不一致。
那么,哪种模拟方法更符合Python的风格呢?
1 个回答
2
它们并不是一样的。从文档中可以看到:
有些类并没有提供公开的接口;比如,它们可能会使用
__getattribute__
来动态创建自己的接口。对于这些类,你可以使用MockAnything
。这个工具不强制要求任何接口,所以你可以随心所欲地调用任何方法。它的工作原理是记录-重放-验证的模式。除非你真的必须使用,不然不要用这个! 你可以通过你的 Mox 实例的CreateMockAnything
方法来创建一个MockAnything
,方法如下:
相比之下,当你使用 CreateMock(Foo)
创建一个模拟对象时,如果调用了一个未知的方法,就会抛出异常。