Используйте mox, чтобы смоделировать метод by__init__ - PullRequest
1 голос
/ 22 июня 2011

Я бы хотел выделить один метод в классе, который вызывается методом 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 ]

3 голосов
/ 22 июня 2011

Не могли бы вы подкласс MyClass напрямую и переопределить method_with_side_effects?

1 голос
/ 28 июля 2011

Если вы хотите только заглушить метод, вы можете использовать модуль заглушки:

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()

Если вам не требуется проверка поведения, используйтепни вместо насмешек гораздо менее хрупки.

...