2012-09-21 10 views
0

我試圖用Django處理ModelForms時測試消息的內容。我有以下視圖(假設有一個Thing模型所需name場):爲無效表單測試Django.contrib.messages的內容

@login_required 
def update(request, thing_id): 
    thing = Thing.objects.get(id=thing_id) # assume this works 

    if request.method == "POST": 
     form = ThingModelForm(request.POST, instance=thing) 
     if form.is_valid(): 
      form.save() 
      messages.success(request, "Success!") 
      return redirect("/wherever") 
     else: 
      messages.error(request, "Oops!") 
    else: 
     form = ThingModelForm(instance=thing) 

    args = ("myapp/update.html", {"form": form}) 
    kwargs = {"context_instance": RequestContext(request)} 
    return render_to_response(*args, **kwargs) 

現在,我有兩個單元測試。第一次測試有效數據,第二次測試無效數據。 (請注意,客戶端登錄時setUp發生):

def test_update_account(self): 
    url = reverse('update', args=[1]) # assume that's a valid id 
    resp = self.client.post(url, {"name": "foo"}) 
    self.assertEqual(resp.status_code, 302) 

    m = resp.cookies.get('messages', '') 
    self.assertTrue("Success!" in m.output()) 

現在來測試無效數據:

def test_update_account_failure(self): 
    url = reverse('update', args=[1]) # assume that's a valid id 
    resp = self.client.post(url, {"name": ""}) # name is required 
    self.assertEqual(resp.status_code, 200) 

    # This works: 
    self.assertTrue("Oops!" in resp.content) 

    # This fails: 
    m = resp.cookies.get('messages', '') 
    self.assertTrue("Oops!" in m.output()) 

爲什麼會通過cookie工作訪問郵件內容在一個實例,但在另一個失敗?

+0

爲了記錄我使用的是Django 1.3.2 –

回答

1

兩件事情你可以檢查:

  1. 當您創建請求self.client.post(url, {"name": ""})是一個東西實例返回這裏:thing = Thing.objects.get(id=thing_id)如果沒有它不會達到的代碼,你設置你的錯誤信息行:messages.error(request, "Oops!")的事情.objects.get會拋出error

如果沒有結果匹配查詢,獲得()將引發 DoesNotExist例外。

  1. 如果第一件事確實返回的事情例如,你可以檢查設置錯誤消息messages.error(request, "Oops!")後重定向回redirect("/wherever")是否會改變任何事情。
+0

我知道Thing實例存在(我實際上刪除了代碼檢查,所以這個例子會更短),所以對於這個問題我並不擔心引發'DoesNotExist'異常。 –

+0

如果我正確理解了你的第二條評論,在這種情況下,如果它沒有驗證,我想重新顯示綁定窗體;如果在設置不會發生的「糟糕」消息後重定向。 –

+0

這是正確的,但我建議嘗試一下,看看你的測試是否通過。這將意味着Django在發生重定向時將cookie返回給cookie,並在上下文中返回「正常」響應的消息。如果這個假設證明是正確的,那麼你必須改變你的測試用例中的斷言,因爲測試用例測試了永遠不會發生的事情。 –