2015-10-07 39 views
0

我想用Unittests在ModelAdmin中重現一個(明顯的)問題。Django ModelAdmin對象在Unittests中的後續請求中被重用?

在ModelAdmin中,我在保存模型時執行一些額外的操作。爲此,我介紹新的實例變量collection_page

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    def save_model(self, requset, obj, form, change): 
     ... 
     if obj_is_new: 
      self.collection_page = .... 
     ... 
     self.collection_page # <== AttributeError if obj is not new. 

我使用django.test.Client兩次,這樣的測試模塊:

class CollectionAdminTestCase(django.test.TestCase): 
    ... 
    def test_redirect_after_editing_existing_object(self): 
     self.client.post(
      self.creation_path, 
      self.creation_post 
     ) 
     response = self.client.post(
      self.change_path, 
      self.change_post 
     ) 
     self.assertEqual(
      response.status_code, 302 
     ) 

測試通過,但它應該失敗。

當我在save_model方法在MyModelAdmin開頭添加

 try: 
      del self.collection_page 
     except AttributeError: 
      pass 

,測試失敗,因爲它應該。

這是Django的預期功能?有沒有更好的方法來處理它?

回答

2

您絕對不應該在ModelAdmin對象上設置狀態。它在服務器進程的整個生命週期中都存在;任何設置在它上面的請求都會被保留。

你不會說這個變量你在做什麼,所以很難提供關於如何做到最好的建議。只有,不是這樣。

+0

我在保存模型時所做的事情太複雜,無法在沒有實例變量的情況下執行 - 我創建了一系列包含特定內容的cms頁面。所以,我會把我的邏輯放到模型中。有關管理員的便利是有人可以訪問請求用戶。通知模型實例關於用戶可能是最好的主意。 –

相關問題