1

テストしなければならないコードをいくつか継承しましたが、残念ながら、このコードはテスト容易性を考慮して作成されていないため (依存性注入も何もない)、問題に直面しています。

シナリオ

問題は基本的に依存関係の巨大なツリーです。テストするコードが存在するモジュールをインポートすると(それを と呼びましょうmymodule)、インポートされたモジュールは他のモジュールをインポートし、これらはいくつかのインポートも行います(自動的にいくつかの接続も行います) DBに)。それは悪いことですが、クールなmockフレームワークを使用してすべてのモジュールをモックすることで、私はそれを受け入れることができました。

しかし、最悪の場合、テストしたいクラス ( と呼びましょうMyClass) が別の ORM 関連のクラスを継承していて ( と呼びましょうORMBase)、テストしたい多くのメソッドが使用されているため、コードのテスト可能性が完全に破壊されます。これから来るいくつかの方法ORMBase。また、実行時ではなくロード時に実行されるORMBaseため、直接モックすることはできません...class MyClass(ORMBase)

ハッキーな解決策

「幸いなことに」、ORMBase がロードされる前にインターセプトするハックな方法を見つけました。これは、mymodule.pyファイルをテキストとして読み取り、インポートを識別し、sys.modules. それで、クラスのORMBaseクラスを変更するmock.MagicMockと、ほら、テストを実行できます。

本当の問題

mymodule.pyファイルのハード ドライブ内のパスが必要です。ハッキング ソリューションのベータ版を試したとき、ハードコードされたファイル パスを使用しましたが、これは長期的な解決策ではありません。そのため、インポートせずに .py ファイルのパスを見つけようとしています。モジュールとの使用を提案する同様の質問を見たことがありますが、実際には、それらはモジュールのロードを妨げません。pkgutilimp

例:

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 のパスが見つかるまでフォルダー/ファイルをいじることですが、このアプローチにはいくつかの問題があると予測しています。もっと良いアイデアはありますか?

ありがとう。

4

0 に答える 0