tôi 'không nhận thức được bất cứ điều gì được xây dựng trong. Việc triển khai thực hiện khá đơn giản:
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()
Điều này yêu cầu chính đối tượng sẽ không sửa đổi self.b, điều này hầu như luôn đúng.
Nguồn
2010-09-30 10:49:13
+1 để làm sáng tỏ thế giới của tôi một cách cụ thể bằng mô-đun Mock tuyệt vời. –
@RonCohen: Vâng, nó khá tuyệt vời và luôn trở nên tốt hơn. :) – Macke
Trong khi sử dụng giả chắc chắn là con đường để đi, tôi khuyên không nên sử dụng assert_called_once, chỉ đơn giản là không tồn tại :) – FelixCQ