如何在Python中模拟嵌套上下文管理器?

如何在Python中模拟嵌套上下文管理器?,python,unit-testing,mocking,Python,Unit Testing,Mocking,我有一个Python函数,它使用pgdb连接到数据库并执行查询 def execute_query(credentials, query, data): with pgdb.connect(credentials) as conn: with conn.cursor() as cur: cur.execute(query, data) 我正试图为这个函数编写一个单元测试,但在使模拟工作正常时遇到了困难。我遵循了来自

我有一个Python函数,它使用pgdb连接到数据库并执行查询

    def execute_query(credentials, query, data):
        with pgdb.connect(credentials) as conn:
            with conn.cursor() as cur:
                cur.execute(query, data)
我正试图为这个函数编写一个单元测试,但在使模拟工作正常时遇到了困难。我遵循了来自的建议,但在尝试模拟嵌套上下文管理器时遇到了问题

最后一个断言失败,因为
out
为None

@mock.patch("pgdb.connect")
def test_execute_query(self, mock_connect):
    query_result = "test"

    cursor_mock = MagicMock()
    cursor_mock.cursor.__enter__.return_value.execute = query_result

    mock_connect.return_value.__enter__.return_value = cursor_mock

    out = execute_query(None, None, None)
    mock_connect.assert_called_once_with()
    mock_connect.return_value.__enter__.assert_called_once()

    cursor_mock.cursor.assert_called_once()
    cursor_mock.cursor.__enter__.assert_called_once()

    self.assertEquals(out, query_result)

有没有人对我如何让它工作有什么建议

.am有问题
-有什么问题?我的Mock
光标.execute
没有返回“test”。在示例中,有一个
用于模拟with语句中用作上下文管理器的对象,该语句使用另一个具有特定返回值的
Mock
方法模拟
。你试过这个或是一个变体吗?这能回答你的问题吗?