1

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()

4

0 回答 0