2011-04-13 63 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