Uncategorizedソフトウェア

pythonのMagicMockにname属性を設定する

PythonのMagicMockは、とても便利なのですがコンストラクタでname属性が指定できません。

>>> a = MagicMock(**{'id': 1, 'name': 'namae'})
>>> a.name
<MagicMock name='namae.name' id='2456793495584'>
>>>

Mock の名前と name 属性のようにMagicMockの仕様なのでMockを作成してからname属性を設定するしかありません。

下記のような関数で、思ったようなコードをかけるようになります。

# https://docs.python.org/ja/3/library/unittest.mock.html#mock-names-and-the-name-attribute
def mkmock(attr, name=None):
attr_name = None
if 'name' in attr:
attr_name = attr['name']
del attr['name']
if name != None:
attr['name'] = name
mock = MagicMock(**attr)
if attr_name != None:
mock.name = attr_name
return mock

こんな感じで書けます。

>>> m = mkmock({'id': 1, 'name': 'python'})
>>> m.name
'python'
>>> m = mkmock(name='mock_name', attr={'id': 1, 'name': 'python'})
>>> m
<MagicMock name='mock_name' id='2456793527728'>
>>> m.name
'python'
>>>
タイトルとURLをコピーしました