テストしなければならないコードをいくつか継承しましたが、残念ながら、このコードはテスト容易性を考慮して作成されていないため (依存性注入も何もない)、問題に直面しています。
シナリオ
問題は基本的に依存関係の巨大なツリーです。テストするコードが存在するモジュールをインポートすると(それを と呼びましょうmymodule
)、インポートされたモジュールは他のモジュールをインポートし、これらはいくつかのインポートも行います(自動的にいくつかの接続も行います) DBに)。それは悪いことですが、クールなmock
フレームワークを使用してすべてのモジュールをモックすることで、私はそれを受け入れることができました。
しかし、最悪の場合、テストしたいクラス ( と呼びましょうMyClass
) が別の ORM 関連のクラスを継承していて ( と呼びましょうORMBase
)、テストしたい多くのメソッドが使用されているため、コードのテスト可能性が完全に破壊されます。これから来るいくつかの方法ORMBase
。また、実行時ではなくロード時に実行されるORMBase
ため、直接モックすることはできません...class MyClass(ORMBase)
ハッキーな解決策
「幸いなことに」、ORMBase がロードされる前にインターセプトするハックな方法を見つけました。これは、mymodule.py
ファイルをテキストとして読み取り、インポートを識別し、sys.modules
. それで、クラスのORMBase
クラスを変更するmock.MagicMock
と、ほら、テストを実行できます。
本当の問題
mymodule.py
ファイルのハード ドライブ内のパスが必要です。ハッキング ソリューションのベータ版を試したとき、ハードコードされたファイル パスを使用しましたが、これは長期的な解決策ではありません。そのため、インポートせずに .py ファイルのパスを見つけようとしています。モジュールとの使用を提案する同様の質問を見たことがありますが、実際には、それらはモジュールのロードを妨げません。pkgutil
imp
例:
assert 'zc' not in sys.modules, 'pre'
loader = pkgutil.get_loader('package.subpackage.module')
assert 'ab' not in sys.modules, 'post'
この例外が発生します:
assert 'ab' not in sys.modules, 'post'
AssertionError: post
したがって、私が持っている次のアイデアは、手動で pythonpath を自分で歩き、mymodule.py のパスが見つかるまでフォルダー/ファイルをいじることですが、このアプローチにはいくつかの問題があると予測しています。もっと良いアイデアはありますか?
ありがとう。