首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让MagicMock表现得像个白痴?

如何让MagicMock表现得像个白痴?
EN

Stack Overflow用户
提问于 2015-05-20 04:16:42
回答 2查看 22K关注 0票数 33

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

这是要测试的功能:

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
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 = {}

但出现了错误:

代码语言:javascript
复制
function_to_be_tested(pole_id, mock_responses)

>>30 not exist

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-20 04:25:36

为什么要和__iter__混在一起?在我看来,你想和__contains__混在一起

代码语言:javascript
复制
>>> 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
票数 55
EN

Stack Overflow用户

发布于 2015-05-20 04:25:26

你总是可以创建一些愚蠢的类来做同样的事情。

代码语言:javascript
复制
In [94]: class MockResponses(dict):
   ....:     def redundantErrorResponses(self):
   ....:         return {}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30340170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档