2017-02-22 2 views
2

Ich Schreibeinheit Tests und zum Testen möchte ich eine Methode des bereits vorhandenen Objekts zu verspotten. Sieht aber mit asyncio corutines aus, es ist nicht so einfach wie es aussieht. Ich habe versucht, MagickMock zu verwenden, aber es funktioniert einfach nicht. Es gibt keine Fehler oder Ausnahmen, aber mit Debugger kann ich sehen, dass f() nie aufgerufen wird.Mock eine Methode von bereits instanziierten Objekt

Meine Tests und Objekt, das ich so patchen sehen will:

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 

Wie ich bereits instanziiert Objektmethode mit einigen benutzerdefinierten einem Patch? Gibt es einige Probleme mit Corutines?

+0

Ihre Frage ein wenig zu kurz ist, eine MCVE bereitzustellen. Ich habe ein paar Fehler nach dem Kopieren-Einfügen Ihres Codes konfrontiert: 1. Verwendung von 'erwarten' in einer Nicht-Coroutine-Funktion' test_my_case' 2. Missing 'module.py', die' msg() 'definiert. Ich habe versucht, diese Fehler zu beheben, aber es wäre besser, wenn Sie Ihre Frage verbessern. – Leon

Antwort

0

ich sah sich auch das Problem versuchen asyncio und wollen in eine Menge Probleme zu verspotten,

ich mit pytest.asycio plugin beendet.

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

Versuchen durch Ersetzen Sie diese Zeile einen Kontext-Manager:

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

mit diesem:

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