2016-07-16 2 views
2

Я пытаюсь высмеять функцию now() Django, чтобы подменять время, используемое в моем приложении. Я могу легко высмеять функцию now() в моем тестовом файле, но замена макета, похоже, не рекурсивно перетекает в мои функции приложений. Вот код, который я использую:Как скомпоновать функцию Django теперь во всех функциях приложения

# file - tests.py: 

import datetime 
import pytz 
import mock 

from django.test import TestCase 

# this is the fake time I am using 
TESTING_DJNOW = pytz.timezone('US/Central').localize(datetime.datetime(2016, 6, 14, 8, 0)) 


# This is the function that replaces django.utils.timezone.now() 
def mocked_djnow(): 
    return TESTING_DJNOW 

@mock.patch('django.utils.timezone.now', side_effect=mocked_djnow) 
class ViewsTestCase(TestCase): 
    fixtures = ['users.json', 'views_data.json'] # our initial test data 

    def setUp(self): 
     self.client = Client() 
     self.client.login(username='fred', password='secret') 

    def test_view(self, *args): 
     from django.utils.timezone import now 
     tm = now() # returns datetime.datetime(2016, 6, 14, 8, 0, 
        # tzinfo=<DstTzInfo 'US/Central' CDT-1 day, 19:00:00 DST>) 

     resp = self.client.get(reverse('myapp:viewfunc1')) 



# file - myapp.views.py: 

from django.utils.timezone import localtime, now 

@login_required 
def viewfunc1(request): 
    # returns datetime.datetime(2016, 7, 16, 1, 11, 6, 964624, tzinfo=<UTC>) 
    tm = now() # returns current datetime 

Возможно ли исправлять функции Django, как сейчас() на протяжении всего приложения? Если да, то что я делаю неправильно? Любые другие предложения?

ответ

1

Мне лично не нравится использовать mocks на свидание из-за постоянной боли. Вместо этого я предлагаю вам попробовать FreezeGun. У вас есть всевозможные приемы, которые вам нужны в ваших тестах и ​​где угодно.

Пример из Docs с часовыми поясами:

from freezegun import freeze_time 

@freeze_time("2012-01-14 03:21:34", tz_offset=-4) 
def test(): 
    assert datetime.datetime.utcnow() == datetime.datetime(2012, 1, 14, 3, 21, 34) 
    assert datetime.datetime.now() == datetime.datetime(2012, 1, 13, 23, 21, 34) 

    # datetime.date.today() uses local time 
    assert datetime.date.today() == datetime.date(2012, 1, 13) 

Также есть интересные функции, такие как ручные клещи и менеджеры контекста. Lib составляет около 500 строк кода и очень хорошо написан, поэтому вы можете прочитать его от А до Я в течение часа, чтобы понять, как он работает.

Смежные вопросы