在Python3.5中模拟异步调用
问题描述
如何使用unittest.mock.patch
模拟从一个本机协程到另一个本机协程的异步调用?
我目前有一个相当尴尬的解决方案:
class CoroutineMock(MagicMock):
def __await__(self, *args, **kwargs):
future = Future()
future.set_result(self)
result = yield from future
return result
然后
class TestCoroutines(TestCase):
@patch('some.path', new_callable=CoroutineMock)
def test(self, mock):
some_action()
mock.assert_called_with(1,2,3)
这个不错,但看起来很难看。有没有更多的蟒蛇方式来做到这一点?
解决方案
解决方案实际上非常简单:
我只需要将mock的__call__
方法转换为协程:
class AsyncMock(MagicMock):
async def __call__(self, *args, **kwargs):
return super(AsyncMock, self).__call__(*args, **kwargs)
这非常有效,当调用mock时,代码接收本机协程
示例用法:
@mock.patch('my.path.asyncio.sleep', new_callable=AsyncMock)
def test_stuff(sleep):
# code
相关文章