使用mox来模拟__init__中调用的方法

2 投票
2 回答
2423 浏览
提问于 2025-04-16 20:05

我想在一个类里模拟一个方法,这个方法是由init方法调用的。

class MyClass(object):
  def __init__(self): 
    # Some initializer code here
    ...
    self.method_with_side_effects()

  def method_with_side_effects(self):
    ... # Load files, etc.

根据Mox的文档,你可以通过创建对象实例,然后使用StubOutWithMock方法来模拟一个方法。但在这种情况下,我无法这样做:

import mox
m = mox.Mox()
myobj = MyClass()
m.StubOutWithMock(myobj, "method_with_side_effects") # Too late!

有没有其他方法可以模拟那个方法呢?

2 个回答

1

如果你只是想简单地占位这个方法,可以使用stubout模块:

import stubout

s = stubout.StubOutForTesting()
s.Set(MyClass, 'method_with_side_effects', lambda self: None)

如果你想真正地模拟这个方法,那就复杂一些。你可以直接用 __new__() 创建一个实例对象,这样可以避免 __init__() 带来的副作用,然后用这个对象来记录你期望的行为:

import mox

m = mox.Mox()
m.StubOutWithMock(MyClass, 'method_with_side_effects')

instance = MyClass.__new__(MyClass)
instance.method_with_side_effects().AndReturn(None)

m.ReplayAll()
MyClass()
m.VerifyAll()

如果你其实不需要验证行为,使用占位符比模拟要稳定得多。

3

你能直接从 MyClass 这个类派生一个新类,并重写 method_with_side_effects 这个方法吗?

撰写回答