PropertyMock,在每次调用后更改值

2024-09-27 07:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图模拟psycopg2,需要处理cursor.description

  # run query 1
  column_names = [desc[0] for desc in cursor.description]
  # run query 2
  # NB cursor.description now returns different value
  column_names = [desc[0] for desc in cursor.description]

我可以通过PropertyMock执行此操作:

  type(fake_cursor).description = PropertyMock(return_value=descriptions[0])

但这并不能解决我的问题,因为测试中的系统执行两次查询,并且第二次的描述将不同

如何在第二次调用时更改模拟的返回值

我试过:

cursor_execute_call_count = 0

def handle_cursor_execute(arg1, arg2):
    cursor_execute_call_count = cursor_execute_call_count + 1
    type(fake_cursor).description = PropertyMock(return_value=descriptions[cursor_execute_call_count])

fake_cursor.execute = Mock(side_effect=handle_cursor_execute)

但我明白了

E     UnboundLocalError: local variable 'cursor_execute_call_count' referenced before assignment

(这对我来说毫无意义。一定有一个奇怪的范围界定问题。)

我最终使用了这段代码,但似乎有更好的方法:

def handle_cursor_execute(arg1, arg2):
  description = descriptions.pop()
  type(fake_cursor).description = PropertyMock(return_value=description)

Tags: runexecutereturnvaluetypecountdescriptioncall
1条回答
网友
1楼 · 发布于 2024-09-27 07:28:22

根据澄清进行编辑

我想您可以实现一个迭代器:

class MyDescription():

    descriptions = iter([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

    def __iter__(self):
        for description_list in self.descriptions:
            for description in description_list:
                yield description
            raise StopIteration
type(fake_cursor).description = PropertyMock(return_value=MyDescription())

所以它看起来是这样的:

>>> z = MyDescription()
>>> [i for i in z]
[1, 2, 3]
>>> [i for i in z]
[4, 5, 6]
>>> [i for i in z]
[7, 8, 9]
>>>

相关问题 更多 >

    热门问题