#amazon-dynamodb #moto
#amazon-dynamodb #мото
Вопрос:
Что я здесь делаю не так? Это мой первый раз, когда я использую moto, и я действительно сбит с толку
conftest.py:
@pytest.fixture(scope='module') def dynamodb(aws_credentials): with mock_dynamodb2(): yield boto3.resource('dynamodb', region_name='us-east-1') @pytest.fixture(scope='module') def dynamodb_table(dynamodb): """Create a DynamoDB surveys table fixture.""" table = dynamodb.create_table( TableName='MAIN_TABLE', KeySchema=[ [..] table.meta.client.get_waiter('table_exists').wait(TableName='MAIN_TABLE') yield
тестовый файл:
mport json import boto3 from moto import mock_dynamodb2 @mock_dynamodb2 def test_lambda_handler(get_assets_event, dynamodb, dynamodb_table): from [...] import lambda_handler dynamodb = boto3.client('dynamodb') response = lambda_handler(get_assets_event, "") data = json.loads(response["body"]) assert response["statusCode"] == 200 assert "message" in response["body"] assert data["message"] == "hello world" # assert "location" in data.dict_keys()
Но проблема в том, что моя лямбда использует помощника, у которого под капотом есть помощник dynamodb, и этот dbhelper запускается следующим образом:
dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(os.environ.get('MAIN_TABLE')) def read_item(key: Dict): try: return table.get_item(Key=key) except ClientError as e: logging.exception(e) raise exceptions.DatabaseReadException(f"Error reading from db: {key}") from e
Разве над этим вообще можно так издеваться? Мне кажется, что когда я импортирую обработчик лямбда, он пытается перезаписать мою издевательскую базу данных, но не может, потому что, очевидно, нет переменной среды os с именем таблицы.
Комментарии:
1. Если имя таблицы должно быть переменной среды, имеет смысл сделать и эту часть теста. Вы можете использовать
mock.patch
, чтобы временно издеваться над этим env var на времяtest_lambda_handler
:@mock.patch.dict(os.environ, {"MAIN_TABLE": "table_name"})
2. Не могли бы вы подробнее объяснить, что происходит не так? Какие ошибки вы получаете?
3. да, я думаю, что у меня есть это для работы с ` monkeypatch.setenv(‘MAIN_TABLE’, ‘MAIN_TABLE’) ` внутри теста 🙂