2012-09-25 12 views
7

生産段階にのみ存在するモジュールのシステムがあるとしましょう。テストの瞬間、これらのモジュールは存在しません。しかし、それらのモジュールを使用するコードのテストを記述したいと思います。また、それらのモジュールから必要なオブジェクトをすべて模倣する方法を知っていると仮定しましょう。質問は、どうすれば便利にモジュールのスタブを現在の階層に追加するのですか?存在しないモジュールの階層を模擬するにはどうすればよいですか?

ここに小さな例があります。私がテストしたい機能は、ファイルに配置されactual.pyと呼ばれる:私のテストスイートで

actual.py: 


def coolfunc(): 
    from level1.level2.level3_1 import thing1 
    from level1.level2.level3_2 import thing2 
    do_something(thing1) 
    do_something_else(thing2) 

私はすでに、私は必要なすべてを持っている:私はthing1_mockthing2_mockを持っています。また、私はテスト機能を持っています。私が必要とするのは、現在のモジュールシステムにlevel1.level2...を追加することです。このように:

tests.py 

import sys 
import actual 

class SomeTestCase(TestCase): 
    thing1_mock = mock1() 
    thing2_mock = mock2() 

    def setUp(self): 
    sys.modules['level1'] = what should I do here? 

    @patch('level1.level2.level3_1.thing1', thing1_mock) 
    @patch('level1.level2.level3_1.thing1', thing2_mock) 
    def test_some_case(self): 
    actual.coolfunc() 

私は私が上の別のオブジェクトを含むオブジェクトでsys.modules['level1']を代用してできることを知っています。しかし、それは私のためのコードのように思える。はるかにシンプルできれいなソリューションが必要であると私は推測しています。私はそれを見つけることができません。

答えて

9

誰も私の問題を助けなかったので、私はそれを自分で解決することに決めました。 Hereは、存在しないモジュールのスタブを作成できるようにするsurrogateというマイクロライブラリです。

Libは、このようなmockと一緒に使用することができる。

from surrogate import surrogate 
from mock import patch 

@surrogate('this.module.doesnt.exist') 
@patch('this.module.doesnt.exist', whatever) 
def test_something(): 
    from this.module.doesnt import exist 
    do_something() 

まず@surrogateデコレータは、非既存のモジュールのスタブを作成し、その後@patchデコレータはそれらを変更することができます。 @patchのように、@surrogateのデコレータは "複数で"使用でき、複数のモジュールパスをスタブします。すべてのスタブは装飾された機能の生涯にのみ存在します。

誰でもこのライブラリを使用すれば、それは素晴らしいことでしょう:)

関連する問題