python - 如何模拟在谷歌云函数全局范围内实例化的对象
问题描述
我一直在阅读 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'}
打印输出。
我很困惑你应该如何使用谷歌建议的全局对象,同时仍然能够正确测试。任何人都可以提供任何建议吗?
解决方案
推荐阅读
- android - viewpager 2 中的当前可见片段
- javascript - 如何使用 ES6 递归删除第一个和最后一个元素?
- javascript - Polymer 3 中的条件渲染
- angular - Angular 中的 RxStomp 服务架构
- python - 在雅虎财经中刮取财务报告
- bitbucket - 限制拉取请求的数量 Bitbucket
- php - Laravel collection multi level groupBy insert new items without checking each level's key
- javascript - 如何更改html标签内容
- linux - Qt5/Yocto:捕获已部署应用程序的屏幕/屏幕录像
- android - 如何在 Android 的共享表上显示默认文件应用程序?