আমি কীভাবে জ্যাঙ্গো ডোন নটএক্সিস্ট ব্যতিক্রম আমদানি করব?


122

আমি কোনও ইউনিট টেস্ট তৈরি করার চেষ্টা করছি যা কোনও বস্তু মুছে ফেলা হয়েছে তা যাচাই করতে।

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.

নীচে আমার উত্তরের সাথে সম্পর্কিত নয়, এটি কি () কলটি প্রশ্নের উত্তর মুছে ফেলছে? যদি তা হয় তবে এটি সত্যিই একটি মুছে ফেলা উচিত, জেট নয়।
স্টিভ জলিম

উত্তর:


136

আপনার এটি আমদানি করার দরকার নেই - যেমন আপনি ইতিমধ্যে সঠিকভাবে লিখেছেন, DoesNotExistএই ক্ষেত্রে এটি নিজেই মডেলের একটি সম্পত্তি Answer

আপনার সমস্যাটি হ'ল আপনি সেই getপদ্ধতিটি কল করছেন - এটি ব্যতিক্রম হওয়ার আগে - এটি পাস হওয়ার আগে assertRaisesইউনিটেস্ট ডকুমেন্টেশনে বর্ণিত হিসাবে আপনাকে কলযোগ্য থেকে আর্গুমেন্টগুলি পৃথক করতে হবে :

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
। ভাল উত্তর, শুধুমাত্র উপরে স্নিপেট প্রথম অবৈধ সিনট্যাক্স যেমন ধরা হবে (পাইথন 2.7 দ্বারা অন্তত), হওয়া উচিত self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact = '<p>User can reply to discussion.</p>')- অর্থাৎ সঙ্গে getপৃথক KW args হিসেবে নিজেকে যুক্ত এর আর্গুমেন্ট, না একটি ভিতরে ()
মার্টিন বি।

1
আও, অবশ্যই! আমি এখানে ডোরোথির মতো অনুভব করছি। আমি উঁচু এবং নিচু সন্ধান করছিলাম, কেবল এটিই আমার সাথে ছিল!
নিক এস

পাইথন ৩.6 / জাঙ্গো ২.২ কেবল withসমাধানটি আমার পক্ষে কাজ করেছিল।
থারাস

183

এছাড়াও আপনি আমদানি করতে পারেন ObjectDoesNotExistথেকে django.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

জন্য সতর্ক এক জিনিস যে দ্বিতীয় প্যারামিটার assertRaises চাহিদা শুধু একটি সম্পত্তি নয় - একটি callable যাবে। উদাহরণস্বরূপ, এই বিবৃতিটি নিয়ে আমার অসুবিধা ছিল:

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.