Как я могу уменьшить количество повторяющихся строк кода в модульных тестах 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'