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