Python中如何正确Mock Google Cloud Datastore的Query调用
问题原因
你打桩的是Query类本身,client.query(...)执行时会调用被mock的datastore的Query类生成实例,你直接在类层级配置fetch方法的返回值,实际代码调用的是Query实例的fetch方法,所以配置不生效,断言也会失败。
修正后的实现代码
from google.cloud.datastore import Client from unittest.mock import patch def foo(): client = Client() try: ancestor = client.key("anc", "123") query = client.query(kind="child", ancestor=ancestor) for q in query.fetch(limit=1): assert False, "Successfully mocked everything" finally: client.close() p = patch( "google.cloud.datastore.client.Query", spec=["fetch"], ) with p as mock_query_klass: # 配置Query实例的fetch方法返回值,mock_query_klass.return_value就是生成的实例 mock_query_klass.return_value.fetch.return_value = [1, 2] foo() mock_query_klass.return_value.fetch.assert_called_once()
修改点说明
- 调整了
spec参数,只保留实例实际存在的fetch方法,删除无用的__call__声明 - 改为通过
mock_query_klass.return_value访问Query实例,再给实例的fetch方法配置返回值、做调用断言
内容的提问来源于stack exchange,提问作者abergmeier
相关产品推荐
相关产品推荐

