assert_called_once_with() с datetime.now() в параметре вызова?

#python #python-unittest

#python #python-unittest

Вопрос:

У меня есть следующий тестовый код для тестирования Decorator .

 @mock.patch('a.b.c.KafkaProducer')
def test_1(self, mocked):
    decorator = Decorator(....)

    @decorator()
    def test():
        return 42
    test()

    start_time = ???
    v = {'type': 'batch', 'start_time': start_time.isoformat()}
    mocked.return_value.send.assert_called_once_with(value=v)
  

Однако тест всегда завершается неудачей, потому Decorator что вызовы издеваются с параметром словаря со свойством start_time присваивается datetime.now() . Это способ сравнить все, кроме start_time ? Или любой другой способ проверить вызов?

Ответ №1:

Два практических подхода:

время замораживания с использованием https://pypi.org/project/freezegun /

 import datetime
from freezegun import freeze_time
from unittest.mock import patch
import my_library


NOT_NOW = datetime.datetime.now()


@freeze_time("2020-01-01")
@patch("my_library.helper")
def test_foo(_helper):
    my_library.under_test(NOT_NOW)
    # kinda auto-magic
    _helper.assert_called_once_with(datetime.datetime.now())
    # or more explicitly
    _helper.assert_called_once_with(datetime.datetime(2020, 1, 1))

  

или вычислите аргументы вручную

 @patch("my_library.helper", return_value=42)
def test_bar(_helper):
    my_library.under_test(NOT_NOW)
    assert _helper.call_count == 1
    assert _helper.call_args[0][0]
    assert _helper.call_args[0][0] != NOT_NOW