我尝试使用mock
用python编写一些单元测试。
例如,我有以下课程:
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
我只想测试handle
方法。不需要假设任何关于socketserver.BaseRequestHandler
的事情。例如,我想断言handle
使用参数1024
调用recv
。有可能用mock做这种事吗?一、 用mock替换基类socketserver.BaseRequestHandler
?还是我偏离了这个想法?
带着埃卡穆尔的回答(谢谢!)我首先尝试了以下方法:
patcher = patch.object(TCPHandler, '__bases__', (Mock,))
with patcher:
patcher.is_local = True
handler = TCPHandler()
handler.handle()
但是现在handle
不再被调用,并且dir(handler)
给出:
['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']
type(handler)
给出
<class 'mock.TCPHandler'>
我认为修补基类也会将派生类变成一个模拟类。
我现在尝试了另一个想法:
mock = MagicMock()
TCPHandler.handle(mock)
#assertions
然而,这种模仿似乎不被称为。
我认为问题在于你试图模仿你想要测试的实际代码。而不是被代码调用的对象。如果您想知道handle方法是否调用self.request上的recv方法,那么就模拟一下recv方法。
为了让handler实例化,您可能需要做一些额外的设置,但是基本的思想应该是清楚的。
我不知道这是否是最好的解决方案,但我使用type()用不同的父类重新定义了前面的类。我构建了一个名为
patch_parent()
的函数,该函数返回具有父模拟的类:在此之后,您可以像这样使用
patch_parent
:MockFoo
类仍然有Foo
类的方法,并且它没有在父类中定义方法,因为父类现在是Mock
类。可以通过修补派生类的
__bases__
来完成此操作:当反转修补程序时,
is_local
黑客必须停止mock.patch
尝试调用delattr
。相关问题 更多 >
编程相关推荐