Как я могу уменьшить количество повторяющихся строк кода в модульных тестах Python при использовании moto с Dynamo DB?

Я пишу несколько тестов для пакета, который использует DynamoDB AWS, и я пытаюсь moto для насмешек. Это работает хорошо, за исключением того, что если у меня есть два теста, и я использую @mock_dynamodb2 decorator, теперь мои тесты работают так, что мне нужно дважды создать объект макета таблицы. Я попытался создать макет таблицы в методе setUp(), но это привело к boto3 работает напрямую, вместо насмешливых методов. Есть ли более чистый способ настроить это?

Вот примерная версия моего кода:

class TestSomeClass(unittest.TestCase):

    def setUp(self):
        self.someclass = someclass.SomeClass()


    @mock_dynamodb2
    def testDynamoDB(self):
        dynamodb = boto3.resource('dynamodb', 'us-east-1')
        table = dynamodb.create_table(
            TableName='MyTable',
            KeySchema=[
                {
                    'AttributeName': 'MyKey',
                    'KeyType': 'HASH'
                },
            ],
            AttributeDefinitions=[
                {
                    'AttributeName': 'MyKey',
                    'AttributeType': 'S'
                },

            ],
            ProvisionedThroughput={
                'ReadCapacityUnits': 5,
                'WriteCapacityUnits': 5
            }
        )

        self.someclass.some_method(test_data)
        #==================        
        # call test methods, assert stuff, etc
        #==================

    @mock_dynamodb2
    def testAgain(self):
        dynamodb = boto3.resource('dynamodb', 'us-east-1')
        table = dynamodb.create_table(
            TableName='MyTable',
            KeySchema=[
                {
                    'AttributeName': 'MyKey',
                    'KeyType': 'HASH'
                },
            ],
            AttributeDefinitions=[
                {
                    'AttributeName': 'MyKey',
                    'AttributeType': 'S'
                },

            ],
            ProvisionedThroughput={
                'ReadCapacityUnits': 5,
                'WriteCapacityUnits': 5
            }
        )

        self.someclass.another_method(test_data)
        #==================
        # dang, look at all that duplicate code above for this 2nd test,
        # that can't be the right way to do this!
        #==================

Я попробовал это в setUp(), но тесты не пройдены с ошибкой ресурса:

    @mock_dynamodb2
    def setUp(self):
        dynamodb = boto3.resource('dynamodb', 'us-east-1')
        table = dynamodb.create_table(
            TableName='MyTable',
            KeySchema=[
                {
                    'AttributeName': 'MyKey',
                    'KeyType': 'HASH'
                },
            ],
            AttributeDefinitions=[
                {
                    'AttributeName': 'MyKey',
                    'AttributeType': 'S'
                },

            ],
            ProvisionedThroughput={
                'ReadCapacityUnits': 5,
                'WriteCapacityUnits': 5
            }
        )
        self.someclass = someclass.SomeClass()

Вот ошибка, которую я получил:

        if http.status_code >= 300:
            error_code = parsed_response.get("Error", {}).get("Code")
            error_class = self.exceptions.from_code(error_code)
>           raise error_class(parsed_response, operation_name)
E           botocore.errorfactory.ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the PutItem operation: Requested resource not found

api_params = {'Item': [deleted]}
error_class = <class 'botocore.errorfactory.ResourceNotFoundException'>
error_code = 'ResourceNotFoundException'
event_response = None
handler    = <function inject_api_version_header_if_needed at 0x1108c9f28>
http       = <botocore.awsrequest.AWSResponse object at 0x113c27ac8>
operation_model = OperationModel(name=PutItem)
operation_name = 'PutItem'
parsed_response = {'Error': {'Code': 'ResourceNotFoundException', 'Message': 'Requested resource not found'}, 'ResponseMetadata': {'HTTP...F33'}, 'HTTPStatusCode': 400, 'RequestId': '[deleted]', 'RetryAttempts': 0}}
request_context = {'auth_type': None, 'client_config': <botocore.config.Config object at 0x1133c7400>, 'client_region': 'us-east-1', 'has_streaming_input': False, ...}
request_dict = {[deleted some stuff]...}
self       = <botocore.client.DynamoDB object at 0x1133c7828>
service_id = 'dynamodb'
service_name = 'dynamodb'

0 ответов

Другие вопросы по тегам