Используйте mox, чтобы смоделировать метод by__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!
Есть ли другой способ заглушить этот метод?
2 ответа
Не могли бы вы подкласс 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()
Если вам на самом деле не нужна проверка поведения, использование заглушек вместо макетов гораздо менее хрупко.