Ошибка «Запрошенный ресурс не найден» в библиотеке Python Moto

1

Я пишу тестовый пример в Python для DynamoDB, используя библиотеку moto, и у меня есть код, как показано ниже:

import boto3
import pytest
from moto import mock_dynamodb2
from myapp import save_contact


@mock_dynamodb2
def test_contact_save_to_dynamo():
    assert save_contact(
        '[email protected]',
        'John Appleseed'
    ) == 200

В результате теста появляется следующее сообщение об ошибке:

E       AssertionError: assert 'Requested resource not found' == 200

Я дважды проверил область и имя таблицы, и она существует в консоли. Когда я запускаю код для размещения элемента в моей таблице DynamoDB, он успешно сохраняет его в таблице, например:

import datetime
import boto3
from botocore.exceptions import ClientError

AWS_REGION = 'us-east-1'
DYNAMODB_TABLE = 'aprs_messages'

time_stamp = str(int(datetime.datetime.utcnow().timestamp()))

ddb_client = boto3.client('dynamodb',region_name=AWS_REGION)


def save_contact(email, name):
    try:
        response = ddb_client.put_item(
            TableName=DYNAMODB_TABLE,
            Item={
                'message_time': {'N': time_stamp },
                'email': {'S': email },
                'name': {'S': name }
                }
        )

    except ClientError as e:
        return e.response['Error']['Message']
    else:
        return response['ResponseMetadata']['HTTPStatusCode']

x = save_contact(
    '[email protected]',
    'John Appleseed'
    )

print(x)

Когда я запускаю этот код, я получаю код ответа 200, и я также могу видеть запись в таблице DynamoDB. Что может быть здесь?

Версия пакета:

  • Python: 3.7.0
  • boto3: 1.7.84
  • moto: 1.3.6
Теги:
python-3.x
amazon-dynamodb
boto3
moto

1 ответ

1
Лучший ответ

При использовании moto вам необходимо создать базовый ресурс, прежде чем выполнять какие-либо действия на этом ресурсе. В вашем случае вам нужно сделать create_table перед выполнением put_item из вашей тестовой функции.

  • 0
    Огромное спасибо. Я потратил довольно много времени, чтобы понять, почему это не работает. Простой вызов API create_table изнутри функции устранил проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню