2017-02-22 4 views
2

私は単体テストを書いてテストしています。私はすでに存在するオブジェクトのメソッドをモックしたいです。 しかし、asyncioのコルーチンのように、それは見た目ほど単純ではありません。 私は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 

どのように私はいくつかのカスタム1で既にインスタンスオブジェクトのメソッドにパッチを適用することができますか?コルーチンに関するいくつかの問題はありますか?

+0

あなたの質問はMCVEを提供するという少し短いです。コードをコピーした後、いくつかのエラーに直面しました:1.非コルーチン関数 'test_my_case'の中で' await'を使う。2. 'msg()'を定義する 'module.py'がありません。私はそれらのエラーを私の理解の中で解決しようとしましたが、あなたの質問を改善する方が良いでしょう。 – Leon

答えて

0

また、私はpytest.asycio pluginを使用して終了し、asyncioを模擬し、トラブルの多くにしたいしようとして

を問題に直面しました。

@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 
関連する問題