首页 > 解决方案 > 如何模拟在谷歌云函数全局范围内实例化的对象

问题描述

我一直在阅读 Google 的一些 Cloud Functions 最佳实践。他们提到在全局范围内创建 HTTP 会话和与 Google Cloud API 的连接,以便可以重用连接。这是相关链接:

https://cloud.google.com/functions/docs/bestpractices/networking#maintaining_persistent_connections

以下是该页面中的两个示例:

在此处输入图像描述

在此处输入图像描述

如果您现在需要在测试中模拟其中一个类,您会怎么做?我试图用补丁装饰器来做,但我发现原来的类仍在使用,大概是因为在读取主模块时正在执行代码,这对于补丁装饰器来说为时已晚:

# main.py

import os
import bigcommerce

# Create this global api object so that the http connection can be reused
api = bigcommerce.api.BigcommerceApi(client_id=os.getenv('CLIENT_ID'), store_hash=os.getenv('STORE_HASH'), access_token=os.getenv('AUTH_TOKEN'))

def my_cloud_function():
    # Fetch product id 1 from the api
    product = api.Products.get(1)
    print(product)
# test_my_cloud_function.py

import main
from unittest import mock

@patch('main.bigcommerce.api.BigcommerceApi')
def test_product_is_fetched(mock_api):
    mock_api.return_value.Products.get.return_value = {'id': 1, 'name': 'foo'}
    main.my_cloud_function()

当我运行这个测试时,我可以从实际的 BigCommerce API 中得到一个错误,因为正在使用真正的类。但是,如果我将 api 对象的创建移出全局范围并将其放入内部my_cloud_function,那么当测试运行时,我会看到预期的{'id': 1, 'name': 'foo'}打印输出。

我很困惑你应该如何使用谷歌建议的全局对象,同时仍然能够正确测试。任何人都可以提供任何建议吗?

标签: python

解决方案


推荐阅读