2016-07-16 6 views
2

Ich versuche, Djangos now() - Funktion zu verspotten, um die in meiner Anwendung verwendete Zeit zu verfälschen. Ich kann die Funktion now() in meiner Testdatei leicht verspotten, aber die Scheinwiederholung scheint nicht rekursiv in meine Anwendungsfunktionen einzudringen. Hier ist der Code, ich bin mit:Wie man Djangos jetzt Funktion in allen Anwendungsfunktionen vortäuscht

# 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 

Ist es möglich, Django Funktionen wie jetzt() in der gesamten Anwendung flicken? Wenn ja, was mache ich falsch? Irgendwelche anderen Vorschläge?

Antwort

1

Ich persönlich mag keine Mocks für Datum wegen der ständigen Schmerzen. Stattdessen schlage ich vor, Sie geben FreezeGun einen Versuch. Es hat alle Arten von datetime fiddling utils, die Sie in Ihren Tests und wo auch immer brauchen.

Beispiel von docs mit Zeitzonen:

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) 

Auch sie hat coole Features wie manuelle Zecken und Kontext-Manager. Die lib ist etwa 500 Zeilen Code und sehr gut geschrieben, so dass Sie es innerhalb einer Stunde von A bis Z lesen können, um zu verstehen, wie es funktioniert.