无法对导入的模块进行monkeypatch

2024-04-23 10:21:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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)使用(我想我也需要模拟该对象)


Tags: 对象nameimportprojectclientidformatdata