2009-08-24 61 views
3

我有一個要求是這樣的:如何單元測試會話超時在Django

只要用戶signsup(並會處於等待狀態,直到他確認他的電子郵件地址),會話變量設置的東西如「FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY」(抱歉,如果名稱聽起來令人困惑!)將被設置爲將日期時間對象添加到當前時間8小時。

這應該如何影響用戶,用戶得到8小時的時間才能真正使用我們網站的所有功能,而無需確認他的簽名電子郵件地址。 8小時後,每個視圖/頁面將顯示一個大橫幅,告訴用戶確認。 (所有這些功能都是使用每個視圖的一個「ensure_confirmed_user」裝飾器來實現的)。

我想用django的unittest addon(TestCase類)測試相同的功能。我該怎麼做?

更新:我是否需要手動更新提到的會話變量值(修改8小時到幾秒)以完成它?或者有更好的方法嗎?

更新:這可能聽起來很瘋狂,但我想模擬來自未來的請求。

+0

[freezegun(https://pypi.python.org/pypi/freezegun/)讓你隨意操縱時間的測試。由此產生的測試也很明確。 – 2016-05-02 09:50:31

回答

0

我可以想到幾種可能性。在測試運行期間,覆蓋FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY變量並將其設置爲較小的時間限制。然後,您可以等到該時間限制結束並驗證功能是否按預期工作。

或者更換自己datetime功能(假設你的功能依賴於datetime

您可以通過覆蓋setup_teardown_test_environment方法實現這些。

3

一般來說,如果單元測試很困難,因爲產品代碼依賴於不會合作的外部資源,那麼可以將這些資源抽象出來並用做你想做的虛擬代替。

在這種情況下,外部資源是時間。而不是使用datetime.now(),重構代碼以接受外部時間函數。它可以默認爲datetime.now。然後在你的單元測試中,你可以隨着測試的進行改變時間。

這比將會話超時更改爲幾秒鐘要好,因爲即使這樣,您也必須在測試中休眠幾秒才能獲得所需的效果。單元測試應該儘可能快地運行,以便它們能夠更頻繁地運行。

0

根據django是在生產環境還是在開發環境中運行,我的settings.py稍有不同。我有2個設置模塊:settings.py和settings_dev.py。開發版本如下所示:

from settings import * 

DEBUG = True 

INSTALLED_APPS = tuple(list(INSTALLED_APPS) + [ 
      'dev_app', 
      ]) 

現在你可以用不同的方式解決問題:

  1. 不同的值都設置模塊添加的變量;
  2. 設置變量的位置,根據DEBUG設置的值在兩個值之間進行選擇。您還可以在生產服務器上使用DEBUG省略單元測試,因爲無論如何測試可能需要很長時間。

您可以使用活動設置模塊是這樣的:

from django.conf.project_template import settings 

if settings.DEBUG: 
    ...