Pytest Mock AWS SecurityManager - PullRequest
       86

Pytest Mock AWS SecurityManager

0 голосов
/ 05 августа 2020

в моем проекте есть файл с именем config.py, который, среди прочего, имеет следующий код:

class Secret(Enum):
    DATABASE_A = 'name_of_secret_database_A'
    DATABASE_A = 'name_of_secret_database_A'

    def secret(self):
        if self.value:
            return get_secret(self.value)
        return {}

def get_secret(secret_name):
    session = Session()
    client = session.client(
        service_name='secretsmanager',
        region_name='us-east-1',
    )
    secret_value = client.get_secret_value(SecretId=secret_name)
    return loads(secret_value.get('SecretString', "{}"))

Мне нужно как-то имитировать get_secret в тестах с pytest для всех перечислений вызывает, например Secret.DATABASE_A.secret ()

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете использовать monkeypatch, чтобы переопределить поведение get_secret(). Я сделал метод get_secret() методом c класса Secret, но вы можете сделать его частью любого модуля и импортировать его. Просто убедитесь, что вы также изменили в вызове monkeypatch.setattr().

import pytest
from enum import Enum


class Secret(Enum):
    DATABASE_A = 'name_of_secret_database_A'
    DATABASE_B = 'name_of_secret_database_B'

    def secret(self):
        if self.value:
            return Secret.get_secret(self.value)
        return {}
        
    @staticmethod
    def get_secret(secret_name):
        session = Session()
        client = session.client(
            service_name='secretsmanager',
            region_name='us-east-1',
        )
        secret_value = client.get_secret_value(SecretId=secret_name)
        return loads(secret_value.get('SecretString', "{}"))

def test_secret_method(monkeypatch):
    def get_secret(secret_name):
        return "supersecret"
    
    monkeypatch.setattr(Secret, "get_secret", get_secret)

    s = Secret.DATABASE_A
    assert s.secret() == "supersecret"

Это возвращается в 1 пройденный тест.

Здесь происходит то, что я создал функцию get_secret() в моем test_secret_method, а затем перезапишите Secret.get_secret() этим новым методом. Теперь вы можете использовать класс Secret в своем test_method и быть уверенным, что метод get_secret () вернет без фактического запуска исходного кода.

...