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>