我正在尝试对Django应用程序进行单元测试,并在此过程中使用Mock模拟数据库调用,如下所示(其中Record是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块也无法捕获异常。
答案 0 :(得分:2)
您正在做两件事,两件事都与实际提出Record.DoesNotExist
例外情况相同。您可以在控制台中试用它们。
第一个是使用消息“Record.DoesNotExist”引发类Exception(所有异常的基类)的异常。你的try / except没有捕获它,因为它(正确)只捕获实际的DoesNotExist
类。
第二个也引发了类Exception的异常,除了这次消息是类Record.DoesNotExist
。同样,try / except不会捕获它,因为异常的类 - 而不是消息 - 是错误的。
相反,您只需要将实际的异常类传递给side_effect:
Record.objects.get.side_effect = Record.DoesNotExist