10

本番段階にのみ存在するモジュールのシステムがあると仮定しましょう。テストの時点では、これらのモジュールは存在しません。それでも、それらのモジュールを使用するコードのテストを書きたいと思っています。また、これらのモジュールから必要なすべてのオブジェクトをモックする方法を知っていると仮定しましょう。問題は、モジュール スタブを現在の階層に簡単に追加するにはどうすればよいかということです。

ここに小さな例があります。テストしたい機能は、次のファイルに配置されています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_mockますthing2_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']別のオブジェクトを含むオブジェクトなどで置き換えることができることを知っています。しかし、それは私にとっては多くのコードのようです。もっとシンプルできれいな解決策があるに違いないと思います。私はそれを見つけることができません。

4

2 に答える 2

16

だから、誰も私の問題を助けてくれなかったので、自分で解決することにしました。これは、存在しないモジュールのスタブ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デコレータは「複数形」で使用できるため、複数のモジュール パスをスタブ化できます。すべてのスタブは、装飾された関数の存続期間中にのみ存在します。

誰かがこのライブラリを使用できるようになったら、それは素晴らしいことです:)

于 2012-09-27T21:40:14.767 に答える