2016-07-17 9 views
0

パッケージされたオブジェクトの1つの関数からコールバックが呼び出されることをテストしようとしています。しかし、mock.patch.objectは、私が現在のテストケースから関数をモックすることを許可していません。私は、次の(簡体字)コードとテストを持っていると仮定すると:Pythonのunittestingとmock:テストケースのモック関数?

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") 

私はエラーに

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' 

を取得するので、私の質問は:私は、現在のテストケースから機能を模擬することができますか?

答えて

0

私の答えが見つかりました:テストコール内でコンテキストマネージャーとしてpatch.objectを使用してください。

関連する問題