1

私はJavalandから来たpythonにはかなり慣れていません。私はいくつかのモジュールを作成しており、それらを個別にテストしたいと考えています。これらのいくつかは、他のモジュールで定義された関数に依存しています。テストからコードを実行するときにテスト モジュールを挿入する軽量な方法を見つけて、それらのテストを定義する実際のモジュールの代わりにそれを使用したいと考えています。それを実現する手段として、以下のパターンを思いつきました。

関数をsomemodule.py定義するとします。

def aFunction:
    return _calculate_real_value_and_do_a_bunch_of_stuff()

そのfoo.py関数に依存するクラスがあります:

import somemodule

class Foo:
    def bar(self, somemodule=somemodule):
        return 'bar:' + somemodule.aFunction()

test_foo.py で:

import test_foo

def aFunction:
    return 'test_value'

class FooTest(unittest.TestCase:
    def test_bar(self):
        self.assertEquals('bar:test_value',somemodule.aFunction(test_foo))

これはモジュールを Foo.bar に挿入するために機能しますが、それは良い習慣ですか? 依存関係のあるモジュールのテストを有効にする他のより良い方法はありますか?

コードは非常に読みやすく、関数への引数に依存関係リストがあるという追加の利点があることがわかりました。私が目にする唯一の欠点は、依存性注入 POV の内外で明示的な依存関係があることですsomemodulefoo.py

4

1 に答える 1

3

これを行う通常の方法は、モンキーパッチを使用することです。Python では、次のことができます。

import somemodule
somemodule.aFunction = aFunction

の観点からするとfoosomemodule.aFunctionはテスト関数です。mockライブラリには、ほとんど同じことを行うデコレータpatchがありますが、テストが終了したときに元のものが復元されるようにラップします。

于 2013-09-17T08:51:52.223 に答える