簡體   English   中英

注入Django進行測試和調試

[英]Injecting in Django for testing and debugging

我正在編寫一個很大程度上取決於日期和時間的應用程序。 我希望能夠擁有now()today()的可注入概念。 我當時以為我可以編寫這兩個函數的自己的版本,以檢查一些中心設置,我將其稱為INJECTED_NOW 如果INJECTED_NOW為None,則上述函數將只返回datetime.datetime.now()datetime.date.today() 但是,如果INJECTED_NOW具有datetime值,則上述函數將使用它來獲取now()和today()。

我想知道如何存儲INJECTED_NOW以使其可變。 我希望能夠在一個測試用例的開頭進行設置,並在另一個測試用例之前對其進行修改。 同樣,我希望能夠從請求中設置它,也許使用中間件即可。

這種方法有意義嗎?如果是,我應該如何存儲INJECTED_NOW? 我想避免數據庫訪問。 是否有解決此問題的替代方法?

最近發布了一個名為FreezeGun的庫,它可以像您描述的那樣指定日期時間:

http://stevepulec.com/freezegun/

這是一種使用模擬的方法,有關模擬的更多信息,請參閱文檔

# this should be the code your are testing
import datetime

def one_minute_ago():
    return (datetime.datetime.now() - datetime.timedelta(seconds=60)).time()


# this would be in your tests file
import mock
import sys
import unittest

class SomeTestcase(unittest.TestCase):

    def test_one_minute_ago(self):
        real_datetime = datetime.datetime
        fake_now = datetime.datetime(2012, 12, 21, 11, 13, 13)
        with mock.patch('datetime.datetime', spec=datetime.datetime) as datetime_mock:
            datetime_mock.now.return_value = fake_now

            self.assertEqual(one_minute_ago(), datetime.time(11, 12, 13))


if __name__ == '__main__':
    sys.exit(unittest.main())

要測試它,只需將代碼復制到文件中,然后使用Python運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM