模拟已经实例化的对象的方法

时间:2017-02-22 10:40:08

标签: python python-3.5 python-unittest python-asyncio

我编写单元测试和测试我想模拟已有对象的方法。 但看起来像asyncio corutines它并不像看起来那么简单。 我试图使用MagickMock,但它不起作用。没有错误或异常,但是使用调试器我可以看到永远不会调用f()。

我想要修补的测试和对象看起来像这样:

from unittest.mock import patch, MagicMock

class Service(object):
   async def callback_handler(self, msg):
      pass

   async def handle(self, msg):
      await self.callback_handler(msg)

class TestCase(object):
    def setUp(self):
      self.service = Service()

    @patch('module.msg')  
    def test_my_case(self, msg_mock):
      f_was_called = False

      async def f():
        global f_was_called   
        f_was_called = True

      self.service.callback_handler = MagicMock(wraps=f) # here I try to mock
      await self.service.handle(msg_mock)
      assert f_was_called is True

如何使用一些自定义对象方法修补已经实例化的对象方法? corutines有一些问题吗?

2 个答案:

答案 0 :(得分:2)

尝试使用上下文管理器替换此行:

self.service.callback_handler = MagicMock(wraps=f) # here I try to mock

有了这个:

with mock.patch.object(self.service, 'callback_handler', side_effect=f) as mock_cb:
    ... # rest of code indented

答案 1 :(得分:0)

我也遇到了试图模拟asyncio并想要遇到很多麻烦的问题,

我结束了使用pytest.asycio plugin

@pytest.mark.asyncio
async def test_some_asyncio_code():
    res = await library.do_something()
    assert b'expected result' == res