ksaitoの日記

日々試したことの覚え書き

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'
>>>