2014-02-23 36 views
0

正如this question中所解釋的,我試圖隔離在Django測試中完成的文件系統更改。在每次測試之前初始化MEDIA_ROOT和Django存儲

在測試運行之前,我基本上正在改變settings.MEDIA_ROOT。不幸的是,Django存儲類似乎不受它影響,所以即使MEDIA_ROOT指向另一個臨時目錄,文件也會保存在原始位置。

如何重新初始化Django存儲系統以反映新的媒體根目錄?

更新:問題是設置文件被預加載到一個django.conf.Settings對象中,並且settings.MEDIA_ROOT的任何更改都未反映在預加載的實例中。我仍然不知道如何克服這個問題。

+0

你在哪裏改''settings.MEDIA_ROOT'',在測試中,在yourapp.settings? – Zulu

+0

在我的Test類以及TestRunner類中。 – zmbq

+0

並且每個文件都有不同的''MEDIA_ROOT''? – Zulu

回答

1

原來我只需要改變兩個設置:

from django.conf import settings as django_settings 
from project import settings 

django_settings.MEDIA_ROOT = settings.MEDIA_ROOT = '....' 

這解決了這個問題。

也許另一個問題是,我沒有在整個系統中使用django.conf.settings,而是我自己的導入設置。我會在某個時候改變這一點。

2

您可能想在測試中使用Django的built-in feature to override settings。這正是它的目的。

直接從該文檔中,注意with self.settings

from django.test import TestCase 

class LoginTestCase(TestCase): 

    def test_login(self): 

     # First check for the default behavior 
     response = self.client.get('/sekrit/') 
     self.assertRedirects(response, '/accounts/login/?next=/sekrit/') 

     # Then override the LOGIN_URL setting 
     with self.settings(LOGIN_URL='/other/login/'): 
      response = self.client.get('/sekrit/') 
      self.assertRedirects(response, '/other/login/?next=/sekrit/') 
+0

Ooooh,這似乎是一個好主意!我將在我的setUp()方法中添加它,並在tearDown()中清理! – zmbq

+0

@zmbq注意,這是一個[上下文管理器](http://legacy.python.org/dev/peps/pep-0343/),所以它不適用於'setUp'和'tearDown'。 「設置」的更改僅在「位於縮進塊內」時纔有效。 –

+0

我很確定我可以在setUp中調用'self.settings(...)',保存結果上下文並將其關閉到tearDown中。但是,由於我在原始問題中提到的問題,這還不夠,我還需要從測試運行器中更改MEDIA_ROOT,以避免人們忘記調用setUp時出現問題。 – zmbq

相關問題