2017-03-26 7 views
1

mockitoをPythonの単体テストに使用しているときに、解決策が見つからないという問題が発生しました。私は特定のクラスメソッドでio.BytesIOの使用法にパッチを当てようとしています。次のコードは、問題が発生した簡易版を示しています。mockitoを使ってPythonでビルトイン/エクステンションの種類をパッチする方法は?

from mockito import mock, patch, when 
from io import BytesIO 

class Foo: 
    def bar(self): 
     buffer = io.BytesIO() 
     # ... 
     return buffer.getvalue() 

def test_foo(): 
    bytesIO_mock = mock(strict=True) 
    when(bytesIO_mock).getvalue().thenReturn('data') 

    patch(BytesIO.__new__, lambda: bytesIO_mock) 
    result = Foo().bar() 
    assert result == 'data' 

を私がテストを実行すると、私は次のエラーを取得しています:

/venv/lib/python3.6/site-packages/mockito/mockito.py:270: in patch 
when2(fn, Ellipsis).thenAnswer(replacement) 
/venv/lib/python3.6/site-packages/mockito/mockito.py:245: in when2 
return invocation.StubbedInvocation(theMock, name)(*args, **kwargs) 
/venv/lib/python3.6/site-packages/mockito/invocation.py:284: in __call__ 
self.mock.stub(self.method_name) 
/venv/lib/python3.6/site-packages/mockito/mocking.py:117: in stub 
self.replace_method(method_name, original_method) 
/venv/lib/python3.6/site-packages/mockito/mocking.py:108: in replace_method 
self.set_method(method_name, new_mocked_method) 

self = <mockito.mocking.Mock object at 0x10d50cb38>, method_name = '__new__' 
new_method = <function Mock.replace_method.<locals>.new_mocked_method at 0x10d753e18> 

    def set_method(self, method_name, new_method): 
>  setattr(self.mocked_obj, method_name, new_method) 
E  TypeError: can't set attributes of built-in/extension type '_io.BytesIO' 

/venv/lib/python3.6/site-packages/mockito/mocking.py:74: TypeError 

は、この問題への解決策はありますか、それだけですPythonで特定のオブジェクトをモックすることはできません?代わりに次のようにあなたは、単にio.BytesIO()からの応答を模擬することができpatchを使用しての

答えて

1

:経験則として

def test_foo(): 
    bytesIO_mock = mock(strict=True) 

    when(bytesIO_mock).getvalue().thenReturn('data') 
    when(io).BytesIO().thenReturn(bytesIO_mock) 

    result = Foo().bar() 
    assert result == 'data' 

は、Pythonではすべてのオブジェクトがas everything in Python is an objectを嘲笑することができます。あなたがそれを嘲笑することができないなら、それはおそらく、使用されているテストライブラリ/フレームワークの制限に起因するでしょう。

関連する問題