2

我在 python 文件中有以下代码。我必须对这个文件进行单元测试。但为了做到这一点,我需要实例化类的对象

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.")

上述类还包含其他需要测试的方法。如何在不调用 bigquery API 的情况下模拟每个方法的对象?

4

2 回答 2

4

我让它工作了。基本上,您需要模拟对 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

于 2020-01-01T06:14:11.540 回答
2

虽然您接受的解决方案可以工作,但模拟所有bigquery.Client. 这将防止实现更改破坏模拟,并且可以轻松设置返回值:

from unittest.mock import patch

@patch('google.cloud.bigquery.Client', autospec=True)
def my_test(mock_bigquery): 
  mock_bigquery().query.return_value = ...
于 2021-07-20T22:35:24.353 回答