在 python 中模拟 BigQuery 连接
Mocking BigQuery Connection in python
我在 python 文件中有以下代码。我必须对该文件进行单元测试。但是为了做到这一点,我需要实例化 class
的对象
class BigQuery(metaclass=singleton.Singleton):
"""
Big Query Class for operations on big query
Will standardize in future versions.
"""
def __init__(self):
"""
Used for initializing client
"""
try:
self.client = bigquery.Client.from_service_account_json(
SERVICE_ACCOUNT_JSON)
except:
logging.error("Cannot instantiate bigquery client", exc_info=True)
raise Exception("Cannot instantiate bigquery client.")
以上class还包含其他需要测试的方法。如何在不调用 bigquery 的情况下为每个方法模拟对象 API??
我成功了。基本上,您需要模拟对 bigquery 客户端初始化的函数调用。在 mock.patch
的帮助下,我们可以模拟客户端对象或函数 from_service_account_json
。以下是代码
with patch.object(bigquery.Client, "from_service_account_json") as srv_acc_mock:
srv_acc_mock.return_value = Mock()
# do something here....
我们也需要为 GCS 客户端遵循相同的模式,但通过导入正确的模块将 bigquery.Client
更改为 storage.Client
。
虽然您接受的解决方案可以工作,但模拟所有 bigquery.Client
会更加完整和稳健。这将防止实现更改破坏模拟,并且可以轻松设置 return 值:
from unittest.mock import patch
@patch('google.cloud.bigquery.Client', autospec=True)
def my_test(mock_bigquery):
mock_bigquery().query.return_value = ...
我在 python 文件中有以下代码。我必须对该文件进行单元测试。但是为了做到这一点,我需要实例化 class
的对象class BigQuery(metaclass=singleton.Singleton):
"""
Big Query Class for operations on big query
Will standardize in future versions.
"""
def __init__(self):
"""
Used for initializing client
"""
try:
self.client = bigquery.Client.from_service_account_json(
SERVICE_ACCOUNT_JSON)
except:
logging.error("Cannot instantiate bigquery client", exc_info=True)
raise Exception("Cannot instantiate bigquery client.")
以上class还包含其他需要测试的方法。如何在不调用 bigquery 的情况下为每个方法模拟对象 API??
我成功了。基本上,您需要模拟对 bigquery 客户端初始化的函数调用。在 mock.patch
的帮助下,我们可以模拟客户端对象或函数 from_service_account_json
。以下是代码
with patch.object(bigquery.Client, "from_service_account_json") as srv_acc_mock:
srv_acc_mock.return_value = Mock()
# do something here....
我们也需要为 GCS 客户端遵循相同的模式,但通过导入正确的模块将 bigquery.Client
更改为 storage.Client
。
虽然您接受的解决方案可以工作,但模拟所有 bigquery.Client
会更加完整和稳健。这将防止实现更改破坏模拟,并且可以轻松设置 return 值:
from unittest.mock import patch
@patch('google.cloud.bigquery.Client', autospec=True)
def my_test(mock_bigquery):
mock_bigquery().query.return_value = ...