Python mock pytest не работает с "assert None" для утверждений вызова функции - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь имитировать некоторые вызовы boto3, и похоже, что имитируемая функция возвращает правильное значение, и похоже, что если я изменю утверждение, чтобы оно больше не соответствовало тому, что было передано в утверждении, не выполняется, потому что входные параметры не совпадают, однако, если я сделаю их совпадающими, тогда утверждение не будет выполнено с:

E       AssertionError: assert None
E        +  where None = <bound method wrap_assert_called_with of <MagicMock name='get_item' id='139668501580240'>>(TableName='TEST_TABLE', Key={'ServiceName': {'S': 'Site'}})
E        +    where <bound method wrap_assert_called_with of <MagicMock name='get_item' id='139668501580240'>> = <MagicMock name='get_item' id='139668501580240'>.assert_called_with
E        +      where <MagicMock name='get_item' id='139668501580240'> = <botocore.client.DynamoDB object at 0x7f071b8251f0>.get_item
E        +        where <botocore.client.DynamoDB object at 0x7f071b8251f0> = site_dao.ddb_client

Объект Dynamo DB является глобальной переменной.

ddb_client = boto3.client("dynamodb")

def query_ddb():
        """Query dynamo DB for the current strategy.

        Returns:
            strategy (str): The latest strategy from dynamo DB.

        """
        response = None

        try:
            ddb_table = os.environ["DDB_DA_STRATEGY"]

            response = ddb_client.get_item(
                TableName=ddb_table, Key={"ServiceName": {"S": "Site"}}
            )
        except Exception as exception:
            LOGGER.error(exception)

            raise ServerException("The server was unable to process your request.", [])

        return response.get("Item").get("Strategy").get("S")

И мой модульный тест выглядит так:

def test_data_access_context_strategy_ddb(mocker):
    object_key = {
        "ServiceName": {"S": "Site"}
    }

    table_name = "TEST_TABLE"

    expected_response = "SqlServer"

    os_env = {
        "DDB_DA_STRATEGY": table_name,
    }

    ddb_response = {
        "Item": {
            "Strategy": {
                "S": expected_response
            }
        }
    }

    mocker.patch.dict(os.environ, os_env)

    mocker.patch.object(site_dao.ddb_client, "get_item")

    site_dao.ddb_client.get_item.return_value = ddb_response

    data_access_context = site_dao.DataAccessContext()

    response = data_access_context.query_ddb()
    
    assert response == expected_response

    assert site_dao.ddb_client.get_item.assert_called_with(TableName=table_name, Key=object_key)

Я не могу понять, что происходит не так, если я изменяю ожидаемое значение для assert_called_with, например:

assert site_dao.ddb_client.get_item.assert_called_with(TableName="TT", Key=object_key)

Тест не проходит с:

1015

1 Ответ

0 голосов
/ 11 августа 2020

У вас есть два утверждения в этой строке:

assert site_dao.ddb_client.get_item.assert_called_with(TableName=table_name, Key=object_key)

Первое утверждение - assert_called_with, что похоже на то, что вы хотите. Тогда у вас есть еще одно утверждение в начале строки: assert ..., которое утверждает возвращаемое значение функции assert_called_with. Это возвращаемое значение null, когда утверждение проходит. Таким образом, вся строка оценивается как assert null.

tl; dr Не используйте assert дважды.

...