2016-07-16 17 views
2

私のアプリケーションで使用されている時間を偽装するために、Djangoのnow()関数をモックしようとしています。私は簡単に私のテストファイル内の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

私は個人的に、一定の痛みのために日付のモックを使用したくありません。代わりにFreezeGunを試してみることをお勧めします。それはあなたのテストで必要なあらゆる種類の日時計を持っています。タイムゾーンとドキュメントから

例:

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行のコードであり、とてもうまく書かれているので、それがどのように動作するかを理解するために1時間以内にAからZまで読むことができます。

関連する問題