Python Mocking — как издеваться над хранилищем Google.client?

Может ли кто-нибудь помочь с насмешкой над GCP API? Вот функция func.py:

import re
from google.cloud import storage
def is_all_log_entries_sink(sink):
    storage_client = storage.Client()
    if 'filter' not in sink and 'storage.googleapis.com' in sink.get('destination', ''):
        bucket_name = re.search(r'^storage.googleapis.com/([^/]+)$', sink.get('destination')).group(1)  
        bucket = storage_client.lookup_bucket(bucket_name)
        if bucket is not None:
            return True
    return False 

Вот тест:

import mock
from mock import patch, MagicMock
with mock.patch('oauth2client.client.GoogleCredentials.get_application_default') as mock_method:
    import func
@patch('func.storage_client')
def test_is_all_log_entries_sink(mock_obj):
    mock_obj.lookup_bucket = MagicMock(return_value='bucket-name')
    sink = {'name': 'testname', 'destination': 'storage.googleapis.com/bucket-name'}
    assert func.is_all_log_entries_sink(sink) == 1
    assert mock_obj.lookup_bucket.called
    sink = {'name': 'testname', 'destination': 'storage.googleapis.com/bucket-name', 'filter': 'testfilter'}
    assert func.is_all_log_entries_sink(sink) == 0
    sink = {'name': 'testname', 'destination': 'storage.googleapis.com/bucket-name'}
    mock_obj.lookup_bucket = MagicMock(return_value=None)
    assert func.is_all_log_entries_sink(sink) == 0

При запуске PyTest была получена следующая ошибка:

E   google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and
 re-run the application.

Я пытался имитировать аутентификацию Google, но безуспешно. Любая помощь будет оценена.


person kenwynejohnes    schedule 24.12.2019    source источник
comment
вы не можете исправить переменную, которую вы определяете в своей функции, вам нужно исправить фактический класс клиента   -  person gold_cy    schedule 24.12.2019
comment
Откуда вы запускаете код Python?   -  person ericcco    schedule 24.12.2019
comment
@eespinola локально   -  person kenwynejohnes    schedule 25.12.2019
comment
если вы издеваетесь над клиентом, вам не нужна аутентификация. Затем смоделируйте методы клиента, которые вы хотите использовать.   -  person pink spikyhairman    schedule 24.06.2020


Ответы (1)


Одно из возможных решений: имитировать GOOGLE_APPLICATION_CREDENTIALS как переменную env в модуле os. Я считаю GOOGLE_APPLICATION_CREDENTIALS диктовкой, так что насмешка над диктовкой может вам помочь.

например, здесь

person Oleksiy    schedule 24.12.2019