I nie jestem świadomy niczego wbudowanego. Jest to dość proste do wykonania:
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()
Wymaga to, że sam obiekt nie będzie modyfikować self.b, który jest prawie zawsze prawdziwe.
+1 za dyskretne oświecenie mojego świata wspaniałym modułem Mock. –
@RonCohen: Tak, to jest niesamowite, i cały czas się poprawia. :) – Macke
Podczas korzystania z próbnego jest zdecydowanie do zrobienia, odradzam używanie assert_called_once, po prostu nie istnieje :) – FelixCQ