2012-04-04 17 views
9

Tôi có một người trang trí và tôi muốn khẳng định rằng một số phương pháp nhất định trong mã của tôi được trang trí với nó.Làm thế nào để khẳng định rằng một phương pháp được trang trí với python unittest?

import functools 

def decorator(func): 
    def _check_something(*args, **kwargs): 
     # some logic in here 
     return func(*args, **kwargs) 
    return functools.wraps(func)(_check_something) 

class MyClass(object): 

    @decorator 
    def my_method(foo, bar): 
     pass 

Làm thế nào để khẳng định với unittest (unitttest2) mà my_method@decorator và không ai lấy nó, và nó đã không bị lãng quên?

+3

làm một số kiểm tra đó kiểm tra xem chức năng (nó không được gọi là một "phương pháp" trong Python, btw) có hành vi đúng, nâng cao ngoại lệ chính xác, v.v. Nếu có, mọi thứ đều ổn. –

+0

đã cập nhật ví dụ để có phương pháp thực thay vì chỉ là một hàm mô-đun dangling. – Evgeny

+0

Với các bài kiểm tra đơn vị, bạn chỉ kiểm tra xem hàm có thực hiện đúng hay không. Toàn bộ vấn đề này là mọi người có thể cấu trúc lại việc triển khai thực tế như họ muốn, miễn là họ không phá vỡ chức năng. Những gì bạn đang cố gắng làm không có gì để làm với thử nghiệm đơn vị. –

Trả lời

2

Bạn có thể làm điều đó bằng cách dựa vào trang trí của bạn để đánh dấu chức năng trình bao bọc với thuộc tính, sau đó bạn xác nhận.

Thực hành tốt là để người trang trí đặt thuộc tính __wrapped__ trỏ đến hàm ban đầu trên trình bao bọc được trả về.

như sau:

def decorator(func): 
    @functools.wraps(func) 
    def _check_something(*args, **kwargs): 
     # some logic in here 
     return func(*args, **kwargs) 
    _check_something.__wrapped__ = func # <== add this 
    return _check_something 

và sau đó, trên mã thử nghiệm của bạn:

assert getattr(MyClass.my_method, "__wrapped__").__name__ == 'my_method' 
+1

Thuộc tính giữ chức năng được bao bọc nên được gọi là ['__wrapped__'] (http : //docs.python.org/py3k/library/functools.html#functools.update_wrapper). –

+0

Evggeny: bạn đã kiểm tra các chỉnh sửa bạn đã thực hiện cho câu trả lời của tôi chưa? Phương thức retriveng hte weithout lớp '__dict__', trong Python 2.x, cung cấp cho bạn một phương thức ràng buộc - không có đối tượng hàm - Tôi không nghĩ phương thức bị ràng buộc sao chép thuộc tính' __wrapped__' của hàm cơ bản. Oh - Tôi đã thử nghiệm nó ngay bây giờ, thực sự, phương pháp đối tượng proxy truy cập các thuộc tính đối tượng chức năng - Tôi không biết điều đó. – jsbueno

+0

http://pastie.org/3728502 – jsbueno

4

Nếu vì một số lý do bạn không thể sửa đổi trang trí, bạn cũng có thể thử kiểm tra đối với một số đặc trưng của một biến đóng.

Trong ví dụ của bạn, bạn biết rằng bản gốc my_method là biến chỉ đóng bởi các trang trí, vì vậy bạn có thể:

assert (my_method.__closure__ and 
      my_method.__closure__[0].cell_contents.__name__ == my_method.__name__)