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


122

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.

以下の私の回答とは無関係ですが、そのget()呼び出しは問題の回答を削除していますか?もしそうなら、それは本当にGETではなくDELETEであるべきです。
Steve Jalim

回答:


136

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

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

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>')

1
良い答えです。上記のスニペットの最初の1つだけが無効な構文としてキャッチされます(少なくともPython 2.7によって)。self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact = '<p>User can reply to discussion.</p>')つまり、getの引数はの内部ではなく個々のkw引数として追加され()ます
マーティン

1
もちろんです!私はここでドロシーのように感じます。私は高低を探していましたが、それがずっと一緒にいるのを見つけました!
ニックS

Python 3.6 / Django 2.2では、withソリューションのみが機能しました。
theruss

182

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

from django.core.exceptions import ObjectDoesNotExist

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

10

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


3

注意すべきことの1つは、の2番目のパラメーターは、単なるプロパティではなく、呼び出し可能であるassertRaises 必要があることです。たとえば、私はこの発言で困難を抱えていました:

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

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

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

3
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists())

これは要求どおりの質問に正確に答えるものではありません。しかし、それは依然として望ましい解決策であり、望ましい結果を得るための別のアプローチを提供します。
セザール

0

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.