在 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 = ...