2016-07-17 5 views
0

Ich versuche zu testen, dass ein Rückruf von einer Funktion in einem meiner verpackten Objekte aufgerufen wird. Mock.patch.object erlaubt mir jedoch nicht, eine Funktion aus dem aktuellen Testfall zu verspotten. Unter der Annahme, ich habe folgende (vereinfachte) Code und Test:Python-UnitTesting und Mock: Mock-Funktion aus dem Testfall?

import unittest 
from six.moves import cStringIO 
from mock import patch 

class myclass(object): 
    def __init__(self, callback): 
     self.callback = callback 

    def myfunc(key): 
     self.callback(key) 
     # other stuff with key 

class MyTest(unittest.TestCase): 
    def setUp(self): 
     self.myobj = myobj(self._callback) 
     self.cache_store = cStringIO() 

    def _callback(self, key): 
     self.cache_store.write(key) 
     self.cache_store.seek(0) 

    @patch.object('__main__.MyTest', '_callback') 
    def test_callback_called(self, mock): 
     self.myobj.myfunc("any string") 
     self.assertTrue(mock.called) 
     self.assertEqual(self.cache_store.read(), "any string") 

ich den Fehler

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.4/dist-packages/mock/mock.py", line 1297, in patched 
    arg = patching.__enter__() 
    File "/usr/local/lib/python3.4/dist-packages/mock/mock.py", line 1369, in __enter__ 
    original, local = self.get_original() 
    File "/usr/local/lib/python3.4/dist-packages/mock/mock.py", line 1343, in get_original 
    "%s does not have the attribute %r" % (target, name) 
AttributeError: __main__.MyTest does not have the attribute '_callback' 

Also meine Frage ist: Wie kann ich verspotten eine Funktion aus dem aktuellen Testfall?

Antwort

0

Ich fand meine Antwort: Verwenden Sie patch.object als Kontextmanager innerhalb des Testanrufs.