1

私はdatashape Python パッケージを使用しており、新しい型を@datashape.discover.registerデコレータに登録しています。datashape.discover登録しているタイプのオブジェクトを呼び出すと、装飾されている関数が呼び出されることをテストしたいと思います。また、テストで望ましくない副作用があるため、装飾されている関数を実際に実行しないことを意味する、優れた単体テストの原則でこれを行いたいと思います。ただし、これは機能しません。

問題を示すサンプル コードを次に示します。

myfile.py:

@datashape.discover.register(SomeType)
def discover_some_type(data)
    ...some stuff i don't want done in a unit test...

test_myfile.py:

class TestDiscoverSomeType(unittest.TestCase):
    @patch('myfile.discover_some_type')
    def test_discover_some_type(self, mock_discover_some_type):
        file_to_discover = SomeType()

        datashape.discover(file_to_discover)

        mock_discover_some_type.assert_called_with(file_to_discover)

問題は、モックしたい関数がテストの本体でモックされているようですが、装飾されたとき (つまり、インポートされたとき) はモックされませんでした。discover.register関数は基本的に、装飾されている関数を内部的に登録して、指定された型の引数で呼び出されたときに参照しますdiscover()。残念ながら、私が望むパッチを適用したバージョンではなく、毎回実際の関数を内部的に登録しているように見えるため、常に実際の関数を呼び出します。

装飾されている関数にパッチを適用し、呼び出されたときにdatashape.discover呼び出されると主張する方法について何か考えはありますか?

4

1 に答える 1