2013-10-17 28 views
0

我有一個Django視圖,有一個表單,我在單元測試中發佈。這裏的測試的一般結構:即使沒有表單錯誤,爲什麼我的POST請求在我的單元測試中沒有按預期重定向?

class ViewTests(TestCase): 
    form_url = reverse_lazy('myapp:form') 
    success_url = reverse_lazy('myapp:success') 

    def test_form_submission_with_valid_data_creates_new_object_and_redirects(self): 
     attributes = EntryFactory.attributes() 
     attributes['product'] = ProductFactory() # Entry has a ForeignKey to Product 
     response = self.client.post(self.form_url, attributes, follow=True) 
     self.assertEqual(response.status_code, 200) 
     self.assertRedirects(response, self.success_url) 
     self.assertTemplateUsed(response, 'myapp/success.html') 

但是,我似乎無法弄清楚爲什麼重定向不能按預期工作。我已經試過在import pdb; pdb.set_trace()中查看是否有任何表單錯誤(response.context['form'].errors),但我得到的所有回覆都是空的字典。在瀏覽器中提交表單正確重定向,所以我不確定單元測試失敗的原因,也不知道如何正確調試它,因爲錯誤字典中沒有顯示錯誤。

+0

這是一個功能 – yuvi

+0

哦和問候你的問題一個可怕的長名字,因爲測試的重定向我簡直不敢相信它有什麼與表單失敗。你能分享你的urls.py以及你看到的確切的失敗信息嗎?我懷疑一個不好的鏈接可能是問題的根源 – yuvi

+0

@yuvi當然,但是這個'非常長的名字'在有很多單元測試時會派上用場,而且你想知道什麼是失敗的人從它的名字中脫身。 – 3cheesewheel

回答

0

原來有一些錯誤。

首先,頁面上有第二個表格(用於選擇Product),我錯過了。相關的,我應該分配ProductFactory().idattributes['product'],而不是ProductFactory

其次,在我改變這一點後,出現了assertRedirects的問題;我不得不將self.success_url更改爲unicode(self.success_url),因爲assertRedirects無法與代理進行比較。

終產物:

def test_form_submission_with_valid_data_create_new_entry_and_redirects(self): 
    attributes = EntryFactory.attributes() 
    attributes['product'] = ProductFactory().id 
    response = self.client.post(self.form_url, attributes) 
    self.assertRedirects(response, unicode(self.success_url)) 
相關問題