2012-06-19 26 views
90

Tôi đang cố gắng tạo một UnitTest để xác minh rằng một đối tượng đã bị xóa.Làm cách nào để nhập ngoại lệ Django DoesNotExist?

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

tôi tiếp tục nhận được lỗi:

DoesNotExist: Answer matching query does not exist. 
+0

Không liên quan đến câu trả lời của tôi dưới đây, đó là nhận được() gọi xóa trả lời trong câu hỏi? Nếu vậy, điều đó thực sự thực sự phải là DELETE, không phải là GET. –

Trả lời

104

Bạn không cần phải nhập nó - như bạn đã viết một cách chính xác, DoesNotExist là một thuộc tính của mô hình riêng của mình, trong trường hợp này Answer.

Vấn đề của bạn là bạn đang gọi phương thức get - làm tăng ngoại lệ - trước khi được chuyển đến assertRaises. Bạn cần phải tách biệt các đối số từ callable, như mô tả trong unittest documentation:

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

hoặc tốt hơn:

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

Câu trả lời hay, chỉ đoạn đầu tiên của các đoạn mã trên sẽ bị bắt là cú pháp không hợp lệ (ít nhất là bằng Python 2.7)., Nên là 'self.assertRaises (Answer.DoesNotExist, Answer.objects.get, body__exact = '

Người dùng có thể trả lời để thảo luận.

') '- tức là với các đối số' get' được thêm vào dưới dạng kw arg riêng lẻ, không phải bên trong một '()'. –

+1

Augh, tất nhiên rồi! Tôi cảm thấy như Dorothy ở đây. Tôi đã tìm kiếm cao và thấp, chỉ để tìm thấy nó đã được với tôi tất cả cùng! –

8

DoesNotExist luôn luôn là một tài sản của mô hình đó không tồn tại. Trong trường hợp này, nó sẽ là Answer.DoesNotExist.

140

Bạn cũng có thể nhập ObjectDoesNotExist từ django.core.exceptions, nếu bạn muốn có một mô hình độc lập cách chung chung để bắt ngoại lệ:

from django.core.exceptions import ObjectDoesNotExist 

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

Đây là cách tôi làm một bài kiểm tra như vậy.

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 
2

Một điều cần xem ra cho là tham số thứ hai để assertRaisescần để có thể gọi được - không chỉ là tài sản. Ví dụ, tôi gặp khó khăn với tuyên bố này:

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

nhưng điều này đã làm việc tốt:

self.assertRaises(AP.DoesNotExist, lambda: self.fma.ap) 
1
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists()) 
Các vấn đề liên quan