使用mox模拟__init__调用的方法



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

有其他方法可以去掉那个方法吗?

您能直接将MyClass子类化并覆盖method_with_side_effects吗?

如果你只想截取这个方法,你可以使用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()

如果您实际上不需要行为验证,那么使用stub而不是mock就不那么脆弱了。

相关内容

  • 没有找到相关文章