2012-02-08 48 views
17

Tôi có một lớp cơ sở trừu tượng dọc theo dòng:Không bao gồm abstractproperties từ bảo hiểm báo cáo

class MyAbstractClass(object): 
    __metaclass__ = ABCMeta 

    @abstractproperty 
    def myproperty(self): pass 

Nhưng khi tôi chạy nosetests (mà bảo hiểm) về dự án của tôi, nó than phiền rằng dòng def tài sản là chưa được kiểm tra. Nó có thể không thực sự được kiểm tra (AFAIK) như instantiation của lớp trừu tượng sẽ dẫn đến một ngoại lệ được nâng lên ..

Có bất kỳ cách giải quyết này, hay tôi chỉ phải chấp nhận < 100% bảo hiểm thử nghiệm ?

Tất nhiên, tôi có thể xóa việc sử dụng ABCMeta và chỉ đơn giản là nâng cấp cơ sở NotImpementedError, nhưng tôi thích phương pháp cũ hơn.

Trả lời

21

Không có cách nào để loại trừ các thuộc tính trừu tượng chính xác như bạn có, nhưng nếu bạn thực hiện một thay đổi nhỏ, bạn có thể. Có tính chất trừu tượng của bạn nâng cao một lỗi:

@abstractproperty 
def myproperty(self): 
    raise NotImplementedError 

Sau đó, bạn có thể hướng dẫn coverage.py để bỏ qua dòng tăng NotImplementedError. Tạo một file .coveragerc, và đưa vào đó:

[report] 
exclude_lines = 
    # Have to re-enable the standard pragma 
    pragma: no cover 

    # Don't complain if tests don't hit defensive assertion code: 
    raise NotImplementedError 

Để biết thêm ý tưởng về các loại đường bạn có thể muốn luôn luôn bỏ qua, xem: http://nedbatchelder.com/code/coverage/config.html

+0

Tôi đã kết thúc tìm hiểu về '#pragma: không có bìa' trên IRC và đi với nội tuyến đó. Tôi không phải là một fan hâm mộ của việc có một thực hiện trong một tài sản trừu tượng (ngay cả khi nó chỉ là 'nâng cao NotImplementedError' vì nó dường như để đánh bại mục đích). –

+3

chờ đợi: bạn đã đồng ý với việc đưa nhận xét "#pragma: no cover" lên mọi thuộc tính trừu tượng, nhưng bạn không ổn với việc thay đổi nội dung khỏi chuyển đến "nâng cao NotImplementedError"? Với từng người, tôi đoán ... Rất vui khi bạn tìm được một giải pháp mà bạn thích. –

+0

Tôi chắc chắn đồng ý nó không phải là một giải pháp tối ưu, nhưng tôi thích sử dụng chỉ thị nội tuyến như vậy để thay đổi mục đích sử dụng và lợi ích của mô-đun lớp cơ sở trừu tượng .. –

22

Đối với tôi, giải pháp tốt nhất là gì @Wesley đề cập trong bình luận của mình để câu trả lời được chấp nhận, cụ thể thay thế 'pass' với một docstring cho các tài sản trừu tượng, ví dụ:

class MyAbstractClass(object): 
    __metaclass__ = ABCMeta 

    @abstractproperty 
    def myproperty(self): 
     """ this property is too abstract to understand. """ 
1

tôi đã bỏ qua tùy chỉnh logic trong tôi .coveragerc:

[report] 
exclude_lines = 
    pragma: no cover 
    @abstract 

Bằng cách này tất cả abstractmethods và abstractproperties được đánh dấu là bỏ qua.

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