2014-02-17 30 views
4

我想讓我的Django測試創建和修改媒體文件。所以,就像Django測試數據庫一樣,我想在每次測試運行之前設置一個空的MEDIA_ROOT文件夾。在每個Django測試之前初始化MEDIA_ROOT

我想我會創建一個臨時文件夾並指向它的MEDIA_ROOT。但是,我無法弄清楚在哪裏放置代碼。在this example中,創建了一個特殊的Runner。亞軍設立了媒體根,並將其撕下。

不幸的是,setup_test_environment在第一個測試函數運行之前被調用一次,而不是每次運行測試時。

我嘗試創建一個FileSystemTestCase類,它在其setUp函數中設置文件系統,並讓我的所有測試用例都來自它。雖然這可行,但它要求每個編寫測試用例的人都記得調用我的setUp方法,因爲它不會自動調用。

通常我不會爲此煩惱,但忘記調用父級setUp方法的代價可能非常高 - 如果有人忘記了調用並且測試意外地在實時系統上運行,那麼就會發生不好的事情。

編輯:我發現的臨時解決方案是實施我自己的亞軍和基地TestCase。兩者都設置了一個臨時MEDIA_ROOT,因此如果有人忘記調用我的setUp方法,測試將運行在上一個測試的臨時文件夾中,或運行器設置的臨時文件夾中。這可能會導致測試失敗,但不會破壞實時數據。

我希望有一個更優雅的解決方案。

回答

2

在我看來,你試圖解決兩個問題:

  1. 允許測試獨立運行(關於MEDIA_ROOT)當測試者做正確的事(即從你的測試類繼承和致電setUp())。
  2. 讓測試人員在意外做錯事情時弄亂實際數據。

鑑於此,我認爲雙管齊下的方法是有道理的。您的setUp()解決了問題1.但在測試運行器中設置MEDIA_ROOT隱藏了測試人員做錯了事實。相反,我只關注保護數據:例如,您可以將MEDIA_ROOT設置爲None。這將屏蔽MEDIA_ROOT中的實際數據;如果測試人員不使用您的setUp(),那麼測試人員將更容易發現錯誤;並減少代碼重複。

更強大的方法是編寫您自己的測試運行器,在每次測試之前完成設置(以Django處理數據庫的方式進行建模),但這可能會滿足您的需求。

相關問題