在mock上调用python内置dict

在mock上调用python内置dict,python,dictionary,mocking,Python,Dictionary,Mocking,我希望能够设置一个mock,允许我在应用内置dict方法时返回一些内容 我试过使用\uuuu iter\uuuu但没有用。除了一本空字典,我什么也找不到: import mock mocked_object = mock.MagicMock() mocked_object.__iter__.return_value = [1, 2, 3] dict(mocked_object) # {} 实际上,我认为你需要这样做: mocked_object.keys.return_value.__iter

我希望能够设置一个mock,允许我在应用内置
dict
方法时返回一些内容

我试过使用
\uuuu iter\uuuu
但没有用。除了一本空字典,我什么也找不到:

import mock
mocked_object = mock.MagicMock()
mocked_object.__iter__.return_value = [1, 2, 3]
dict(mocked_object)
# {}

实际上,我认为你需要这样做:

mocked_object.keys.return_value.__iter__.return_value = [1, 2, 3]
这样,dict方法将为您提供一个具有这些键的对象,并将
getattr(mocked_object,'1')
(因此,另一个mocked方法)的结果作为值。我认为,如果您希望对结果进行更多控制,也可以通过模拟
keys()
方法来做您想做的事情。

From

如果给定一个位置参数,并且它是一个映射对象,则将创建一个字典,其中包含与映射对象相同的键值对。否则,位置参数必须是iterable对象。iterable中的每个项本身必须是一个具有两个对象的iterable。每个项的第一个对象成为新字典中的键,第二个对象成为相应的值

<>代码> MigICMoC< /Cord>对象暴露了<代码>键< /代码>方法,因为是模拟对象,因此“代码> Dead())/代码>将考虑它们映射对象。不幸的是,如果我们想在
dict
callmock上使用它,那么这种方法使用起来有点复杂,因为它是一个具有预定义键值的字典。以下示例说明如何使用映射对象协议实现到预定义词典的
dict
转换:

>>> m = MagicMock()
>>> d = {"a":"A", "b":"B", "c":"C"}
>>> m.keys.return_value.__iter__.return_value = ["a", "b", "c"]
>>> m.__getitem__.side_effect = ["A","B","C"]
>>> dict(m)
{'a': 'A', 'c': 'C', 'b': 'B'}
>>> #Little bit generic
>>> m.keys.return_value.__iter__.return_value = d.keys()
>>> m.__getitem__.side_effect = lambda k:d[k]
>>> dict(m)
{'a': 'A', 'c': 'C', 'b': 'B'}
两者都有点难读,在我们的测试中,我们希望读一些更简单的东西

要引导dict使用迭代器而不是映射,我们只需从模拟中删除键,然后设置iter。返回值:

>>> del m.keys
>>> m.__iter__.return_value = [("a","A"),("b","B"),("c","C")]
>>> dict(m)
{'a': 'A', 'c': 'C', 'b': 'B'}
>>> #Little bit generic
>>> m.__iter__.return_value = d.items()
>>> dict(m)
{'a': 'A', 'c': 'C', 'b': 'B'}

我想这是一个简单而简洁的方法来设置你的模拟,并从
dict
调用中获得一个预定义的字典。

那么
呢。return\u value=iter([(1,2)、(3,4)])
?不幸的是,我仍然得到一个空字典。这很有效,谢谢!我不明白更多的模拟方法是如何被设置为值的。我还没有深入研究,但我认为dict方法基本上是用keys()查找对象的属性,然后用这些键作为属性构建dict,属性的值作为值。由于该对象是一个模拟对象,因此该值是一个模拟方法。我不建议将lambda函数与dict循环一起使用,它将只返回最后一个dict。您可以简单地说m.。u getitem_uu.side\u effect=d.u getitem__