如何让 MagicMock 表现得像一个字典?
How to let MagicMock behave like a dict?
mock(http://mock.readthedocs.org/en/latest/index.html) 是 python 中用于单元测试的好工具。它可以方便地模拟方法或 class 或 dict.But 我遇到了一个问题,我找不到直接的方法来通过模拟处理。
这是要测试的函数:
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 like object,除了dict固有的特性外,它还有一些其他的属性(比如redundantErrorResponses)。现在我想构建一个模拟响应,让 id in responses
为真,id in responses.redundantErrorResponses
为假。这就是我所做的:
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特性(自由添加属性)?
你总是可以创造一些愚蠢的class来做同样的事情。
In [94]: class MockResponses(dict):
....: def redundantErrorResponses(self):
....: return {}
为什么要和 __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
mock(http://mock.readthedocs.org/en/latest/index.html) 是 python 中用于单元测试的好工具。它可以方便地模拟方法或 class 或 dict.But 我遇到了一个问题,我找不到直接的方法来通过模拟处理。
这是要测试的函数:
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 like object,除了dict固有的特性外,它还有一些其他的属性(比如redundantErrorResponses)。现在我想构建一个模拟响应,让 id in responses
为真,id in responses.redundantErrorResponses
为假。这就是我所做的:
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特性(自由添加属性)?
你总是可以创造一些愚蠢的class来做同样的事情。
In [94]: class MockResponses(dict):
....: def redundantErrorResponses(self):
....: return {}
为什么要和 __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