2011-04-13 67 views
0

我試圖單元測試Django應用程序,並在這個過程中使用Mock如下嘲諷數據庫調用(其中記錄是一個Django模型):嘲諷Django的數據庫調用

Record.objects.get = Mock() 
Record.objects.get.side_effect = Exception("Record.DoesNotExist") # Exception as a string 

,我捕捉異常如下:

except Record.DoesNotExist: 
    return HttpResponseRedirect("http://www.somesite.com") 

然後我得到的運行測試以下錯誤:

Exception: Record.DoesNotExist 

如果不是我嘲笑例外如下:

Record.objects.get.side_effect = Exception(Record.DoesNotExist) # Exception as a class 

接着,我會在運行測試以下錯誤:

Exception: <class 'supersales.plugin.models.DoesNotExist'> 

有人能解釋爲什麼不能將其捕獲的異常,即使有一個try-except塊。

回答

2

你正在做兩件不同的事情,這兩件事情都沒有與實際發生的Record.DoesNotExist異常相同。你可以在你的控制檯試試看。

第一個引發Exception異常(所有異常的基類),消息「Record.DoesNotExist」。你的嘗試/除了沒有抓住它,因爲它(正確)僅僅捕獲實際的DoesNotExist類。

第二個也引發了Exception類的異常,除了這次的消息是類Record.DoesNotExist。同樣,try/except不會捕獲它,因爲異常的類 - 與消息相反 - 是錯誤的。

相反,你只需要實際的異常類傳遞給side_effect:

Record.objects.get.side_effect = Record.DoesNotExist 
+0

是的,我想通了這一點一段時間後。這應該是顯而易見的,我是一個Python新手。儘管如此,非常感謝您的答覆。 – Rohit 2011-04-15 04:23:15