web-dev-qa-db-ja.com

Django DoesNotExist例外をインポートするにはどうすればよいですか?

UnitTestを作成して、オブジェクトが削除されたことを確認しようとしています。

from Django.utils import unittest
def test_z_Kallie_can_delete_discussion_response(self):
  ...snip...
  self._driver.get("http://localhost:8000/questions/3/want-a-discussion") 
  self.assertRaises(Answer.DoesNotExist, Answer.objects.get(body__exact = '<p>User can reply to discussion.</p>'))

エラーが発生し続けます:

DoesNotExist: Answer matching query does not exist.
108
BryanWheelock

インポートする必要はありません-すでに正しく記述しているので、DoesNotExistはモデル自体のプロパティであり、この場合はAnswerです。

問題は、getに渡される前に、assertRaisesメソッド(例外を発生させる)を呼び出していることです。 nittest documentation で説明されているように、引数を呼び出し可能オブジェクトから分離する必要があります。

self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact='<p>User can reply to discussion.</p>')

またはそれ以上:

with self.assertRaises(Answer.DoesNotExist):
    Answer.objects.get(body__exact='<p>User can reply to discussion.</p>')
117
Daniel Roseman

モデルに依存しない汎用的な方法で例外をキャッチする場合は、Django.core.exceptionsからObjectDoesNotExistをインポートすることもできます。

from Django.core.exceptions import ObjectDoesNotExist

try:
    SomeModel.objects.get(pk=1)
except ObjectDoesNotExist:
    print 'Does Not Exist!'
167
Chris Pratt

DoesNotExistは、常に存在しないモデルのプロパティです。この場合、Answer.DoesNotExistになります。

10
defrex

注意すべきことの1つは、assertRaisesneedsの2番目のパラメーターが、単なるプロパティではなく呼び出し可能になることです。例えば、私はこの声明に問題がありました:

self.assertRaises(AP.DoesNotExist, self.fma.ap)

しかし、これはうまくいきました:

self.assertRaises(AP.DoesNotExist, lambda: self.fma.ap)
3
Xiong Chiamiov
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists())
1
Chris

これは私がそのようなテストを行う方法です。

from foo.models import Answer

def test_z_Kallie_can_delete_discussion_response(self):

  ...snip...

  self._driver.get("http://localhost:8000/questions/3/want-a-discussion") 
  try:
      answer = Answer.objects.get(body__exact = '<p>User can reply to discussion.</p>'))      
      self.fail("Should not have reached here! Expected no Answer object. Found %s" % answer
  except Answer.DoesNotExist:
      pass # all is as expected
0
Steve Jalim