2017-02-22 62 views
2

我編寫單元測試和測試我想模擬一個已經存在的對象的方法。 但看起來像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有一些問題嗎?

+0

你的問題是提供MCVE的有點短。在複製粘貼代碼後,我遇到了一些錯誤:1.在非協同函數'test_my_case'中使用'await' 2.缺少定義'msg()'的'module.py'。我試圖解決這些錯誤,盡我所能理解,但如果你改善你的問題會更好。 – Leon

回答

0

我也面臨着試圖ASYNCIO嘲笑,並希望到很多麻煩的問題,

我使用pytest.asycio plugin結束。

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

嘗試使用情況管理器通過更換這行:

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 
相關問題