模拟Django数据库调用

时间:2011-04-13 07:39:51

标签: django exception mocking

我正在尝试对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块也无法捕获异常。

1 个答案:

答案 0 :(得分:2)

您正在做两件事,两件事都与实际提出Record.DoesNotExist例外情况相同。您可以在控制台中试用它们。

第一个是使用消息“Record.DoesNotExist”引发类Exception(所有异常的基类)的异常。你的try / except没有捕获它,因为它(正确)只捕获实际的DoesNotExist类。

第二个也引发了类Exception的异常,除了这次消息是类Record.DoesNotExist。同样,try / except不会捕获它,因为异常的类 - 而不是消息 - 是错误的。

相反,您只需要将实际的异常类传递给side_effect:

Record.objects.get.side_effect = Record.DoesNotExist