我想在一个由 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!
有没有其他方法来删除该方法?
答案 0 :(得分:3)
您可以直接继承MyClass
并覆盖method_with_side_effects
吗?
答案 1 :(得分: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()
如果您实际上不需要行为验证,那么使用存根而不是模拟就不那么脆弱了。