为什么<<<<<<<试试>>?

时间:2011-09-30 14:57:49

标签: python django unit-testing exception-handling tastypie

我有异常的Python(Django)单元测试FAIL,但是失败的代码在为该异常编写的try / except块中。类似的块在直接引发时处理异常。

通过:

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#   Code catches a directly raised ImmediateHttpResponse
try:
    raise ImmediateHttpResponse(response=auth_result)
    self.fail()
except ImmediateHttpResponse, e:
    self.assertTrue(True)

紧随其后,它失败了:

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#   FAIL
try:
    resp = resource.dispatch_list(request)  #<--- Line 172
    self.fail()
except ImmediateHttpResponse, e:
    self.assertTrue(True)

这是跟踪:

Traceback (most recent call last):
  File ".../web_app/tests/api/tastypie_authentication.py", line 172, in test_dispatch_list_diagnostic
  resource.dispatch_list(request)
  File ".../libraries/django_tastypie/tastypie/resources.py", line 410, in dispatch_list
  return self.dispatch('list', request, **kwargs)
  File ".../libraries/django_tastypie/tastypie/resources.py", line 434, in dispatch
  self.is_authenticated(request)
  File ".../libraries/django_tastypie/tastypie/resources.py", line 534, in is_authenticated
  raise ImmediateHttpResponse(response=auth_result)
ImmediateHttpResponse

根据跟踪,dispatch_list()调用失败,因为它引发了&lt;&lt; ImmediateHttpResponse&gt;&gt;例外。但是在try块中放置这样的异常不会产生类似的失败。

为什么try / except块处理一个例外但不处理另一个例外?

请注意,测试代码是从库的测试代码中复制的,该代码确实按预期运行。 (我正在使用库测试代码来诊断我自己的实现失败。)

2 个答案:

答案 0 :(得分:3)

您是否定义了自己的ImmediateHttpResponse? (我是这样,不要这样做。)如果tastypie提出了一个症状,你可能会得到你所描述的症状。 在您的单元测试正在测试时tastypie.exceptions.ImmediateHttpResponse 本地定义的ImmediateHttpResponse

如果是这样,要解决问题,请删除ImmediateHttpResponse的定义并添加类似

的内容
from tastypie.exceptions import ImmediateHttpResponse

在您的单元测试中。

答案 1 :(得分:0)

知道了,问题是我的ImmediateHttpException导入与引发错误的代码的导入不同。

我的导入声明是:

from convoluted.directory.structure.tastypie.exceptions import ImmediateHttpResponse

抛出所用错误的resource.py代码:

from tastypie.exceptions import ImmediateHttpResponse

所以它引发了一个异常!=我导入的那个,尽管它们的字符串输出是相同的。

修复我的import语句解决了这个问题。

感谢收听!