2

collections.SequenceABCを取るように文書化されている関数があるとしましょう。この関数内のコードを ABC インターフェイスに対してテストするにはどうすればよいですか? 私のコードがこの ABC によって定義されたメソッドのみを呼び出し、たとえば によって定義されたメソッドlistやその他の具体的な実装を呼び出していないことを確認する単体テスト (またはテスト) を作成できますcollections.Sequenceか? または、これを確認するための他のツールまたは方法はありますか?

4

2 に答える 2

1

これらのメソッドのみを実装するクラスのインスタンスを渡すことで、関数をテストするだけです。必要に応じて、次のように組み込み型をサブクラス化し、その__getattribute__メソッドlistをオーバーライドできます。

class TestSequence(list):
    def __getattribute__(self, name):
        if name not in collections.Sequence.__abstractmethods__:
            assert(False) # or however you'd like the test to fail
        return object.__getattribute__(self, name)
于 2015-05-29T03:11:57.707 に答える
0

コードでの必要に応じて、単純または複雑なメソッドを使用して、ABC を自分で直接実装します。

import collections

class TestSequence(collections.Sequence):

    def __init__(self):
        pass

    def __len__(self):
        return 3

    def __getitem__(self, index):
        return index

間違いを犯して抽象メソッドの実装を省略した場合、コードでエラーが発生します。

TypeError: Can't instantiate abstract class TestSequence with abstract methods __getitem__

テスト対象のコードが ABC で定義されていないメソッドを呼び出すと、通常の属性なしエラーが表示されます。

AttributeError: 'TestSequence' object has no attribute 'pop'
于 2015-05-29T03:26:14.987 に答える