2017-08-12 1 views
0

メソッドの署名を再作成するためにcreate_autospecを使用しようとしました。私は意図したとおりに機能しなかったことを発見しました。 create_autospec関数は何らかの理由で関数を完全に制約するのではなく、仕様を作成できない場合に例外を発生させるのに十分です。私の現在の回避策は、unittest.mockモジュールのソースコードを変更することでしたが、この解決策は私を満足させません。署名が得られないときにcreate_autospecを失敗させる適切な、「pythonic」な方法がありますか?私はモジュールをラッピングすることも避けたい。私はPython 3.5.2を使用しています。特定のクラスメソッドに `unittest.create_autospec`を使用できません

from inspect import signature 
from unittest.mock import create_autospec, Mock 
import sqlite3 

class Class(object): 
    def method(self): 
     return 'Class_method' 

def function(): 
    return 'function' 

method_mock = create_autospec(Class.method, return_value='mock_Class_method') 
function_mock = create_autospec(function, return_value='mock_function') 
cursor = sqlite3.connect(':memory:').execute('Select 1') 
fetchall_mock = create_autospec(cursor.fetchall, return_value='mock_cursor') 

print(method_mock('self')) 
print(function_mock()) 
print(fetchall_mock()) 
print(fetchall_mock(1)) 
print(cursor.fetchall()) 
print(cursor.fetchall()) 

try: 
    method_mock() 
except TypeError: 
    print('autospec working for method_mock!') 

try: 
    function_mock(1234) 
except TypeError: 
    print('autospec working for function_mock!') 

try: 
    print(cursor.fetchall(1)) 
except TypeError as e: 
    print('autospec NOT working for fetchall_mock: {0}'.format(e)) 

try: 
    signature(cursor.fetchall) 
except ValueError as e: 
    print(e) 

出力:

mock_Class_method 
mock_function 
mock_cursor 
mock_cursor 
[(1,)] 
[] 
autospec working for method_mock! 
autospec working for function_mock! 
autospec NOT working for fetchall_mock: fetchall() takes no arguments (1 given) 
no signature found for builtin <built-in method fetchall of sqlite3.Cursor object at 0x7f2e8b885ea0> 

答えて

0
cursor = sqlite3.connect(':memory:').execute('Select 1') 
fetchall_mock = create_autospec(cursor.fetchall, ...) # This line doesn't effect cursor. 

あなたはそれをパッチを適用する必要が

with mock.patch.object(cursor, 'fetchall', autospec=True, ...) as fetchall_mock: 
    try: 
     print(cursor.fetchall(1)) 
    except TypeError as e: 
     print('autospec NOT working for fetchall_mock: {0}'.format(e)) 
関連する問題