2012-02-08 14 views
17

を報告します。それは...除くabstractpropertiesは、私はの線に沿って抽象基本クラスを持っている

はこれに回避策ではない実際をテストすることが(私の知る限り)抽象クラスのインスタンス化として提起されている例外が発生しますありますすることができ、または私はちょうど< 100%のテストカバレッジを受け入れなければなりません?

もちろん、ABCMetaの使用法を削除し、基本クラスをNotImpementedErrorにすることもできますが、私は前者の方が好きです。

答えて

21

抽象プロパティを正確に除外する方法はありませんが、わずかな変更を加えれば可能です。抽象的なプロパティでエラーを発生させる:

@abstractproperty 
def myproperty(self): 
    raise NotImplementedError 

次に、notImplementedErrorを発生させる行を無視するようにカバレッジ.pyに指示できます。 .coveragercファイルを作成し、それに入れて:あなたは常に無視したいかもしれないラインの種類についてのより多くのアイデアについては

[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 

を参照してください。私にとってhttp://nedbatchelder.com/code/coverage/config.html

+0

私はIRCで '#pragma:no cover'について調べて、そのインラインで行った。私は抽象的なプロパティの実装を持っているファンではありません(目的を破ると思われるので、単にNotImplementedErrorを発生させたとしても)。 –

+3

wait:すべての抽象プロパティに "#pragma:no cover"コメントを入れても大丈夫ですが、本体を "not NotImplementedError raise"に変更しても問題ありませんか?自分自身には、あなたが好きなソリューションを見つけられたらうれしいですね。 –

+0

私は間違いなく最適な解決策ではないと確信していますが、そのようなインライン・ディレクティブを使用して、抽象基本クラス・モジュールの用途と利点を変更することをお勧めします。 –

22

を最善の解決策は何@Wesley言及されました例えば受け入れ答えに彼のコメントは、具体的に抽象プロパティのdocstringと「パス」に置き換えて、中:

class MyAbstractClass(object): 
    __metaclass__ = ABCMeta 

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

私は、カスタムのロジックをスキップしている私の.coveragerc

[report] 
exclude_lines = 
    pragma: no cover 
    @abstract 

このようにして、すべての抽象メソッドと抽象プロパティはスキップされたものとしてマークされます。

関連する問題