Не может monkeypatch импортировать модуль - PullRequest
0 голосов
/ 03 марта 2020

У меня очень простая Google Cloud Function , написанная на Python, и она ссылается на Google Secret Manager через их библиотеку Python.

Код очень прост и это выглядит так:

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']))

, а затем у меня есть мой простой модульный тест, который пытается использовать исправление обезьян :

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)

Все идет хорошо с макетом для переменной среды, но я не могу издеваться secretmanager. Он продолжает пытаться вызвать фактический API. Моя конечная цель - смоделировать secretmanager.SecretManagerServiceClient() и заставить его вернуть объект, который в дальнейшем может быть использован: client.access_secret_version(resource_name) (я думаю, что мне также нужно будет высмеивать)

1 Ответ

0 голосов
/ 19 марта 2020

См. Мой ответ на этот вопрос для рабочего примера использования unittest исправлений и насмешек для насмешки вызовов API Google и возврата ложных результатов: Как смоделировать библиотеку API Google с помощью Python 3.7 для модульного тестирования

...