You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python中GraphCypherQAChain单元测试的Mock失效问题?

解决GraphCypherQAChain单元测试mock返回MagicMock的问题

你的问题核心是mock对象的invoke方法没有被正确配置返回值,或者patch的目标路径不对,导致调用graph_chain.invoke()时返回默认的MagicMock对象而非预期字典。以下是具体解决步骤和代码示例:

1. 检查Patch路径是否正确

确保你patch的是main.py中实际使用的graph_chain实例的正确引用:

  • 如果main.py中是全局实例化graph_chain:
    # main.py
    from langchain.chains import GraphCypherQAChain
    graph_chain = GraphCypherQAChain.from_llm(...)
    
    那么patch路径main.graph_chain是正确的。
  • 如果graph_chain是在函数内部动态创建:
    # main.py
    def query_graph(question):
        graph_chain = GraphCypherQAChain.from_llm(...)
        result = graph_chain.invoke(...)
    
    此时需要patchGraphCypherQAChain.from_llm方法(而非实例),让它返回你的mock对象。

2. 正确配置Mock的返回值

方法一:直接给invoke设置return_value(最简单)

不需要自定义mock类,直接在patch后的MagicMock对象上指定invoke方法的返回值:

# test_main.py
from unittest.mock import patch
import main

def test_query_graph():
    # 定义预期返回的字典
    expected_chain_result = {"result": "模拟的查询结果"}
    
    with patch('main.graph_chain') as mock_chain:
        # 给mock对象的invoke方法设置返回值
        mock_chain.invoke.return_value = expected_chain_result
        
        # 调用被测函数
        result = main.query_graph("测试问题")
        
        # 断言结果符合预期
        assert result == "模拟的查询结果"

方法二:使用自定义Mock类替换实例

如果你需要更复杂的逻辑,可以用自定义类,patch时指定new参数替换原实例:

# test_main.py
from unittest.mock import patch
import main

class MockGraphCypherQAChain:
    def invoke(self, input_data):
        # 可根据input_data做不同返回,这里直接返回固定字典
        return {"result": "模拟的查询结果"}

def test_query_graph():
    with patch('main.graph_chain', new=MockGraphCypherQAChain()):
        result = main.query_graph("测试问题")
        assert result == "模拟的查询结果"

方法三:处理函数内动态创建的实例

如果graph_chain是在函数内创建的,需要patch类的from_llm方法,让它返回你的mock实例:

# test_main.py
from unittest.mock import patch
import main

class MockGraphCypherQAChain:
    def invoke(self, input_data):
        return {"result": "模拟的查询结果"}

def test_query_graph():
    with patch('langchain.chains.graph_cypher_qa.GraphCypherQAChain.from_llm') as mock_from_llm:
        # 让from_llm返回自定义mock实例
        mock_from_llm.return_value = MockGraphCypherQAChain()
        
        result = main.query_graph("测试问题")
        assert result == "模拟的查询结果"

关键注意点

  • 确保invoke方法的返回字典包含被测代码需要的键(比如你的代码需要result键),否则还是会触发ValueError。
  • 检查patch路径的层级:Python的mock是基于导入路径而非文件路径,要精准对应到被patch对象的实际引用位置。

内容的提问来源于stack exchange,提问作者Saikat Bhattacharya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:27:46