У меня есть функция, которая создает полезную нагрузку для вызова API. в полезной нагрузке я использую uuid, чтобы сгенерировать уникальный номер для заголовка. но когда я пытаюсь сравнить ожидаемый результат, он никогда не совпадает, поскольку каждый раз при вызове функции generate_payload возвращается новый uuid. Как справиться с этим, чтобы пройти модульный тест?

My.py

import uuid


def generate_payload():
    payload = {
        "method": "POST",
        "headers": {"X-Transaction-Id":"" +str(uuid.uuid4())+""},
                                        "body": {
        "message": {
            "messageVersion": 1
        },

    }
    }
    return payload

Test_my.py

import my
def test_generate_payload():
    expected_payload = {'method': 'POST', 'headers': {'X-Transaction-Id': '5396cbce-4d6c-4b5a-b15f-a442f719f640'}, 'body': {'message': {'messageVersion': 1}}}
    assert my.generate_payload == expected_payload 

Запустить тест - python -m pytest -vs test_my.py ошибка

...Full output truncated (36 lines hidden), use '-vv' to show

Я также пробовал использовать ниже, но не повезло

 assert my.generate_payload == expected_payload , '{0} != {1}'.format(my.generate_payload , expected_payload)
0
user1591156 15 Окт 2021 в 19:24

2 ответа

Лучший ответ

Вы можете удалить случайность из теста, высмеяв вызов uuid.uuid4():

@mock.patch('my.uuid') # mock the uuid module in your IUT
def test_generate_payload(mock_uuid):
    mock_uuid.uuid4.return_value = 'mocked-uuid'  # make the mocked module return a constant string
    expected_payload = {'method': 'POST', 'headers': {'X-Transaction-Id': 'mocked-uuid'}, 'body': {'message': {'messageVersion': 1}}}
    assert my.generate_payload == expected_payload

Документы для mock.patch

1
rdas 15 Окт 2021 в 16:32

Попробуйте использовать mock:

def example():
    return str(uuid.uuid4())

# in tests...
from unittest import mock

def test_example():
    # static result
    with mock.patch('uuid.uuid4', return_value='test_value'):
        print(example())  # test_value

    # dynamic results
    with mock.patch('uuid.uuid4', side_effect=('one', 'two')):
        print(example())  # one
        print(example())  # two
2
Danila Ganchar 15 Окт 2021 в 16:35