2012-01-22 25 views
5

Tôi đang cố viết một bài kiểm tra đơn vị để đảm bảo HTTPException được nâng lên khi cần thiết. Đây là thử nghiệm:assertRises failure

import unittest 
from requests import HTTPError 
import pyport 

# Code omitted... 
def test_bad_item_type(self): 
    """A bad item type should raise a HTTPError""" 
    test_type = 'bad' 
    test_id = 1986134 
    self.assertRaises(HTTPError, pyport.get_item(test_type, test_id)) 

nào sản xuất như sau:

ERROR: test_bad_item_type (__main__.TestPyportFunctions) A bad item 
type should raise requests.HTTPError 
---------------------------------------------------------------------- 
Traceback (most recent call last): File "./tests.py", line 65, in 
test_bad_item_type 
    self.assertRaises(HTTPError, pyport.get_item(test_type, test_id)) File "/home/sean/workspace/pyport/pyport.py", line 54, in get_item 
    response.raise_for_status() File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 741, fin raise_for_status 
    raise HTTPError('%s Client Error' % self.status_code) HTTPError: 404 Client Error 

Trường hợp ngoại lệ được nâng lên, nhưng nó không được đánh bắt bởi các thử nghiệm. Điều này tương tự như những gì đã xảy ra trong this question, nhưng nó không hoàn toàn giống nhau. Ai đó có thể cho tôi biết tôi đang thiếu gì không?

Trả lời

7

Nó nên là:

self.assertRaises(HTTPError, pyport.get_item, test_type, test_id) 

Xem chữ ký của assertRaises:

assertRaises(exception, callable, *args, **kwds) 

này được định nghĩa theo cách này bởi vì nếu bạn làm điều đó theo cách của bạn, trình thông dịch Python cuộc gọi đầu tiên pyport.get_item(test_type, test_id) và sau đó chuyển kết quả của nó đến assertRaises. Kết quả là assertRaises không được gọi là gì cả và ngoại lệ không bị bắt. Bây giờ nếu assertRaises có quyền truy cập vào hàm và các đối số của nó, nó có thể gọi chính hàm đó và nắm bắt ngoại lệ thích hợp.

+0

Cảm ơn bạn đã giải thích chi tiết. –

1

Nếu bạn đang sử dụng Python 2.7 hay muộn hay bạn đang sử dụng các mô-đun unittest2 backported thay vì unittest, bạn có thể tránh được việc phải viết cú pháp lạ khi sử dụng assertRaises bằng cách sử dụng nó như là một người quản lý bối cảnh:

with self.assertRaises(HTTPError): 
    pyport.get_item(test_type, test_id) 

http://docs.python.org/library/unittest.html#basic-example

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