2009-05-19 29 views
5

Tôi đang thử nghiệm cho trường hợp ngoại lệ sử dụng unittest, ví dụ:Python unittest: làm thế nào để kiểm tra đối số trong một ngoại lệ?

self.assertRaises(UnrecognizedAirportError, func, arg1, arg2) 

và mã của tôi đặt ra:

raise UnrecognizedAirportError('From') 

nào hoạt động tốt.

Làm cách nào để kiểm tra rằng đối số trong ngoại lệ là những gì tôi mong đợi?

Tôi muốn bằng cách nào đó khẳng định rằng capturedException.argument == 'From'.

Tôi hy vọng điều này là đủ rõ ràng - cảm ơn trước!

Tal.

Trả lời

11

Như thế này.

>>> try: 
...  raise UnrecognizedAirportError("func","arg1","arg2") 
... except UnrecognizedAirportError, e: 
...  print e.args 
... 
('func', 'arg1', 'arg2') 
>>> 

Đối số của bạn ở args, nếu bạn chỉ cần phân loại Exception.

Xem http://docs.python.org/library/exceptions.html#module-exceptions

Nếu lớp ngoại lệ được bắt nguồn từ tiêu chuẩn BaseException lớp rễ, giá trị liên quan đến hiện diện như là thuộc tính args trường hợp ngoại lệ của.


Sửa Ví dụ Bigger.

class TestSomeException(unittest.TestCase): 
    def testRaiseWithArgs(self): 
     try: 
      ... Something that raises the exception ... 
      self.fail("Didn't raise the exception") 
     except UnrecognizedAirportError, e: 
      self.assertEquals("func", e.args[0]) 
      self.assertEquals("arg1", e.args[1]) 
     except Exception, e: 
      self.fail("Raised the wrong exception") 
+0

+1, sạch hơn nhiều so với tôi :) –

+0

Tôi biết đã có một số cuộc nói chuyện trên python-dev trong khi trở lại sửa đổi assertRaises để trả lại ngoại lệ bị bắt (và nó đã được đề cập rằng cả hai xoắn và bzr hack unittest để làm điều đó). Có ai biết về bất kỳ khuôn khổ mà thực hiện theo mặc định. Liên kết đến chú thích python-dev: http://mail.python.org/pipermail/python-dev/2008-July/081293.html –

1

assertRaises là một chút đơn giản và không cho phép bạn kiểm tra chi tiết về ngoại lệ đã vượt ra ngoài nó thuộc về một lớp cụ thể. Để kiểm tra các ngoại lệ tốt hơn, bạn cần phải "cuộn riêng" với khối try/except/else (bạn có thể làm điều đó một lần và cho tất cả trong một phương thức def assertDetailedRaises mà bạn thêm vào lớp con chung của trường hợp thử nghiệm của unittest, sau đó có bài kiểm tra của bạn trường hợp tất cả kế thừa lớp con của bạn thay vì của unittest).

Các vấn đề liên quan