2

我想在一个由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!

还有其他方法可以消除该方法吗?

4

2 回答 2

3

您可以直接子类MyClass化并覆盖method_with_side_effects吗?

于 2011-06-22T15:07:13.893 回答
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()

如果您实际上不需要行为验证,那么使用存根代替模拟就不会那么脆弱。

于 2011-07-28T15:54:06.600 回答