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