Pythonunittest.mock
允许我修补一个函数,使其返回多个值:
m = Mock(side_effect=["myName", 100, 200])
m()
然后多次调用将返回"myName", 100
并最终返回200
。
我还可以修补 dictpatch.dict
以返回模拟值,但我所追求的是:
with DictMock(d, return_values=(('a',1), ('a', 2))) as d:
assert d['a'] == 1
assert d['a'] == 2
我创建了一个这样做的类:
In [19]: d_
Out[19]: {'a': 1, 'b': 1}
In [20]: class MockDict:
...:
...: def __init__(self, in_dict, values=(), clear=False):
...: self.in_dict = in_dict
...: keys, values = zip(*values)
...: self.keys = list(keys)
...: self.values = list(values)
...:
...: def __enter__(self):
...: self.orig_dict = self.in_dict.copy()
...: return self
...:
...: def __exit__(self, *args):
...:
...: return False
...:
...: def __getitem__(self, key):
...: try:
...: idx = self.keys.index(key)
...: self.keys.pop(idx)
...: val = self.values.pop(idx)
...: return val
...: except ValueError:
...: raise KeyError(key)
...:
In [21]: with MockDict(d_, values=(("a",4),("a",5))) as d:
...: print(d["a"])
...: print(d["a"])
...:
4
5
我知道我的课程受限于不复制原始键值对的方式......这当然可以改进。
您能提出一个更好的方法来实现这一目标吗?
更新:解释我的动机
我需要测试以下代码段:
code = self.instance.state['Code']
while code != status:
time.sleep(3)
self.instance.reload()
code = self.instance.state['Code']
因此,我必须调用instance.state['Code']
两次,通过函数代码并到达self.instance.reload()