Как проверить фильтр Django REST Framework, используя «сейчас»? - PullRequest
0 голосов
/ 27 февраля 2019

Другие объяснили, почему написание тестов, которые зависят от текущего времени, является плохой идеей (например, невоспроизводимые ошибки и неспособность проверить специальные даты, такие как переходы летнего времени).Поэтому при тестировании сериализаторов я использовал следующий шаблон:

def test_should_be_valid_if_best_before_a_future_date(self) -> None:
    serializer = MyModel(
        data={
            'best_before': datetime.datetime(…),
            …
        },
        context={'now': datetime.datetime(…)},
    )

    self.assertTrue(serializer.is_valid())

Этот шаблон упрощает проверку того, что происходит, когда, например, best_before до, в и после.

Я не нашел похожий шаблон для фильтров - у них, похоже, нет свойства context.Как бы я проводил аналогичные тесты для фильтров, в идеале ничего не насмехаясь, поскольку это делает тест зависимым от деталей реализации?

1 Ответ

0 голосов
/ 28 февраля 2019

Я обычно не время для насмешек, но когда я использую freezegun :

from datetime import datetime
from freezegun import freeze_time

@freeze_time("2019-01-21 01:00:00")
def test_time():
    assert datetime.now() == datetime(2019, 1, 21, 1, 0, 0)

идеально, без насмешек в datetime, так как это делает тест зависимымна детали реализации?

Freezegun не сделает ваш тест зависимым от деталей реализации, потому что он работает на очень низком уровне API Python.

...