gpt4 book ai didi

python - 如何让 MagicMock 表现得像一个字典?

转载 作者:太空狗 更新时间:2023-10-29 17:01:38 26 4
gpt4 key购买 nike

mock( http://mock.readthedocs.org/en/latest/index.html ) 是 python 中用于单元测试的好工具。它可以方便地模拟一个方法或类或字典。但是我遇到了一个问题,我找不到直接的方法来通过模拟来处理。

这是要测试的函数:

def function_to_be_tested(id, responses):
if not id in responses:
print '%s not exist'%pole_id
return

if id in responses.redundantErrorResponses:
print '%s is redundant'%pole_id
return

do_something()

argument responses 是一个类似dict的对象,除了dict固有的特性外,它还有一些其他的属性(比如redundantErrorResponses)。现在我想构建一个模拟响应,让 id in responses 为 True,让 id in responses.redundantErrorResponses 为 False。这就是我所做的:

pole_id = 30
pole_value = 100
pole_dic = {pole_id:pole_value}
mock_responses = MagicMock()
mock_responses.__getitem__.side_effect = lambda k: pole_dic[k]
mock_responses.__iter__.side_effect = iter(pole_dic)
mock_responses.redundantErrorResponses = {}

但是发生了错误:

function_to_be_tested(pole_id, mock_responses)

>>30 not exist

那么如何构造一个 MagicMock 对象同时可以像 dict 一样迭代或者如何构造一个 dict 同时支持 MagicMock 特性(自由添加属性)?

最佳答案

为什么要乱用 __iter__?在我看来,你想弄乱 __contains__:

>>> import mock
>>> m = mock.MagicMock()
>>> d = {'foo': 'bar'}
>>> m.__getitem__.side_effect = d.__getitem__
>>> m.__iter__.side_effect = d.__iter__
>>> m['foo']
'bar'
>>> 'foo' in m
False
>>> m.__contains__.side_effect = d.__contains__
>>> 'foo' in m
True

关于python - 如何让 MagicMock 表现得像一个字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30340170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com