我用Python编写了一个非常简单的Google Cloud Function,它通过Python库引用了Google的Secret manager
代码非常简单,如下所示:
import os
from google.cloud import secretmanager
import logging
client = secretmanager.SecretManagerServiceClient()
secret_name = "my-secret"
project_id = os.environ.get('GCP_PROJECT')
resource_name = "projects/{}/secrets/{}/versions/latest".format(project_id, secret_name)
response = client.access_secret_version(resource_name)
secret_string = response.payload.data.decode('UTF-8')
def new_measures_handler(data, context):
logging.info(secret_string)
print('File: {}.'.format(data['name']))
然后我有一个简单的单元测试,它试图利用monkey patching:
import main
def test_print(capsys, monkeypatch):
# arrange
monkeypatch.setenv("GCP_PROJECT", "TestingUser")
monkeypatch.setattr(secretmanager, "SecretManagerServiceClient", lambda: 1)
name = 'test'
data = {'name': name}
# act
main.new_measures_handler(data, None)
out, err = capsys.readouterr()
#assert
assert out == 'File: {}.\n'.format(name)
环境变量的mock进行得很顺利,但我不能mocksecretmanager
。它不断尝试调用实际的API。我的最终目标是模拟secretmanager.SecretManagerServiceClient()
,并使其返回一个对象,该对象稍后可由:client.access_secret_version(resource_name)
使用(我想我也需要模拟该对象)
有关使用
unittest
修补和模拟来模拟Google API调用并返回模拟结果的工作示例,请参见我对该问题的回答: How to Mock a Google API Library with Python 3.7 for Unit Testing相关问题 更多 >
编程相关推荐