Как издеваться над datetime.now () python в методе класса для модульного тестирования?

Я пытаюсь написать тесты для класса, который имеет такие методы, как:

import datetime import pytz class MyClass: def get_now(self, timezone): return datetime.datetime.now(timezone) def do_many_things(self, tz_string='Europe/London'): tz = pytz.timezone(tz_string) localtime_now = self.get_now(tz) ... return things 

Я хочу проверить его, и для этого мне нужно убедиться, что вызов datetime.datetime.now() возвращает что-то предсказуемое.

Я читал много примеров использования Mock в тестах, но не нашел ничего похожего на то, что мне нужно, и я не могу понять, как его использовать в моих тестах.

Я разделил метод get_now() на случай, если это проще сделать, чем вместо datetime.datetime.now() , но я все еще в тупике. Любые мысли о том, как писать UnitTests для этого с помощью Mock? (Это все в Django, fwiw, я не уверен, что это имеет значение в этом случае.)

  • Издевательский класс: Mock () или patch ()?
  • Как я могу тестировать Django Views?
  • Перезаписать auto_now для unittest
  • Как я могу издеваться над sqlite3.Cursor
  • Убедитесь, что функция вызывает предупреждение с проверками носа
  • Как печатать на консоли в Py Test?
  • Python Смещение функции из импортированного модуля
  • Непрерывное модульное тестирование с Pydev (Python и Eclipse)
  • 4 Solutions collect form web for “Как издеваться над datetime.now () python в методе класса для модульного тестирования?”

    Вы должны создать функцию, которая возвращает определенное время-время, локализованное в часовом поясе, переданном в:

     import mock def mocked_get_now(timezone): dt = datetime.datetime(2012, 1, 1, 10, 10, 10) return timezone.localize(dt) @mock.patch('path.to.your.models.MyClass.get_now', side_effect=mocked_get_now) def your_test(self, mock_obj): # Within this test, `MyClass.get_now()` is a mock that'll return a predictable # timezone-aware datetime object, set to 2012-01-01 10:10:10. 

    Таким образом, вы можете проверить, правильно ли обрабатывается результирующая дата-время, соответствующая часовому поясу; результаты в другом месте должны показывать правильный часовой пояс, но будут иметь прогнозируемую дату и время.

    Вы используете функцию mocked_get_now как побочный эффект при издевательстве get_now ; при get_now кодов get_now вызов записывается посредством mock , и mocked_get_now , и это возвращаемое значение используется как значение, возвращаемое вызывающей стороне get_now .

    Вы можете использовать freezegun :

     from freezegun import freeze_time def test(): assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) with freeze_time("2012-01-14"): assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) 

    Он в основном издевается над вызовами модуля datetime .

    Я использую date , но та же идея должна работать в datetime :

     class SpoofDate(date): def __new__(cls, *args, **kwargs): return date.__new__(date, *args, **kwargs) 

     from mock import patch @patch('some.module.date', SpoofDate) def testSomething(self): SpoofDate.today = classmethod(lambda cls : date(2012, 9, 24)) 

    Где some.module импортирует date . Патч заменяет импортированную date на SpoofDate , которую вы можете переопределить, чтобы делать все, что захотите.

    Я бы использовал помощников из пакета testfixtures, чтобы издеваться над классом datetime, который вы сейчас вызываете ():

    http://packages.python.org/testfixtures/datetime.html#datetimes

    Таким образом, вы можете проверить все случаи, которые у вас есть, все время.

    Python - лучший язык программирования в мире.