Мокинг в соцсетях с moto работает некорректно - PullRequest
1 голос
/ 26 мая 2020

В моем модульном тесте:

def test_my_function_that_publishes_to_sns():
    conn = boto3.client("sns", region_name="us-east-1")
    mock_topic = conn.create_topic(Name="mock-topic")
    topic_arn = mock_topic.get("TopicArn")

    os.environ["SNS_TOPIC"] = topic_arn

    # call my_function
    my_module.my_method()

Тестируемая функция

# inside my_module, my_function...
sns_client.publish(
            TopicArn=os.environ["SNS_TOPIC"], Message="my message",
        )

Я получаю сообщение об ошибке: botocore.errorfactory.NotFoundException: An error occurred (NotFound) when calling the Publish operation: Endpoint with arn arn:aws:sns:us-east-1:123456789012:mock-topic not found

Не имеет смысла, вот и все Предполагается, что topi c moto создал и высмеял. Почему говорят, что его не существует? Если я вызываю conn.publish(TopicArn=topic_arn, Message="sdfsdsdf") внутри самого модульного теста, он, кажется, издевается над ним, но он не имитирует его для my_module.my_method (), который выполняет модульный тест. Может быть, он слишком рано разрушает поддельный топи c?

ИЗМЕНИТЬ Я пробовал это во всех отношениях и получаю ту же ошибку:

# Using context manager
def test_my_function_that_publishes_to_sns():
    with mock_sns():
        conn = boto3.client("sns", region_name="us-east-1")
        mock_topic = conn.create_topic(Name="mocktopic")
        topic_arn = mock_topic.get("TopicArn")

        os.environ["SNS_TOPIC"] = topic_arn

        # call my_function
        my_module.my_method()


# Using decorator
@mock_sns
def test_my_function_that_publishes_to_sns():
    conn = boto3.client("sns", region_name="us-east-1")
    mock_topic = conn.create_topic(Name="mocktopic")
    topic_arn = mock_topic.get("TopicArn")

    os.environ["SNS_TOPIC"] = topic_arn

    # call my_function
    my_module.my_method()


# Using decorator and context manager
@mock_sns
def test_my_function_that_publishes_to_sns():
    with mock_sns():
        conn = boto3.client("sns", region_name="us-east-1")
        mock_topic = conn.create_topic(Name="mocktopic")
        topic_arn = mock_topic.get("TopicArn")

        os.environ["SNS_TOPIC"] = topic_arn

        # call my_function
        my_module.my_method()

Также откройте проблему с github: https://github.com/spulec/moto/issues/3027

1 Ответ

0 голосов
/ 26 мая 2020

проблема заключалась в том, что my_module.my_method () не устанавливал регион, просто выполняя client = boto3.client("sns")

Он не мог найти его, потому что по умолчанию использовался регион diff, чем us-east-1, который был жестко закодирован в модульный тест

...