I No estoy enterado de nada incorporado. Es bastante fácil de implementar:
class assertMethodIsCalled(object):
def __init__(self, obj, method):
self.obj = obj
self.method = method
def called(self, *args, **kwargs):
self.method_called = True
self.orig_method(*args, **kwargs)
def __enter__(self):
self.orig_method = getattr(self.obj, self.method)
setattr(self.obj, self.method, self.called)
self.method_called = False
def __exit__(self, exc_type, exc_value, traceback):
assert getattr(self.obj, self.method) == self.called,
"method %s was modified during assertMethodIsCalled" % self.method
setattr(self.obj, self.method, self.orig_method)
# If an exception was thrown within the block, we've already failed.
if traceback is None:
assert self.method_called,
"method %s of %s was not called" % (self.method, self.obj)
class test(object):
def a(self):
print "test"
def b(self):
self.a()
obj = test()
with assertMethodIsCalled(obj, "a"):
obj.b()
Esto requiere que el objeto en sí mismo no modificará self.b, que casi siempre es cierto.
+1 para discretamente iluminar mi mundo con el maravilloso módulo Mock. –
@RonCohen: Sí, es bastante sorprendente y también mejora todo el tiempo. :) – Macke
Si bien el uso de simulacros es definitivamente el camino a seguir, desaconsejaría usar assert_called_once, simplemente no existe :) – FelixCQ